From af881fa7948617ab89e9fd4c5aa3ad1aa71f601b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Luis=20Bueno=20L=C3=B3pez?= <69244257+JLBuenoLopez-eProsima@users.noreply.github.com> Date: Thu, 22 Feb 2024 16:57:54 +0100 Subject: [PATCH] Branch-out v3.0.0 (#4251) * Refs #19452: branch-out v3.0.0 Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: update XML schema name Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove doc legacy folder. Move github banner to resources folder Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove .settings folder Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove legacy m4 folder Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove legace files from utils folder Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: rename to FASTDDS_DEFAULT_PROFILES_FILE and FASTDDS_DEFAULT_PROFILES Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: update XML Schema name Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: update to Fast DDS, remove references to FastRTPS, remove legacy files Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: update Doxygen modules Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: examples, use fastdds headers instead of fastrtps ones Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: rename security logging macros Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: use fastdds headers Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: update to fastdds headers in public headers Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: update to Fast DDS configuration files. Rename deprecation macro Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: use fastdds headers. Update header guards Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: update fastrtps.rc Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove System deprecated class Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove DataWriter deprecated methods Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove deprecated methods in ServerAttributes Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove deprecated method in LocatorList Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove deprecated attributes in TCPTransportDescriptor Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove SampleInfo deprecated constexpr Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove deprecated participant discovery callback Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove TypeObject deprecated API Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove RPC headers deprecated API Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: rename project to Fast DDS. Update examples, tools and fuzzer CMakeLists. Changes required to build library after updating to fastdds headers Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: fix examples build Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: fixes in test suite Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: linters Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove deprecated API Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: update versions.md Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: fix Windows warning Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove PSM source files and tests Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: move TopicAttributes implementation to src/cpp/rtps/attributes folder Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: sort alphabetically source files Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove Fast RTPS legacy API implementation Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: remove PSM API headers and implementation. Fixes to ensure tests build correctly Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: update to libfastdds.version name and remove exported dds namespace Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: fixes after rebase Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: apply review suggestion related to XML header Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: apply review suggestions Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: missing XML xmlns Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: fixes in TCPv6 unit tests Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: keep legacy installation folder until migration is completed Signed-off-by: JLBuenoLopez-eProsima * Refs #19452: fixes in TCPv4 unit tests Signed-off-by: elianalf <62831776+elianalf@users.noreply.github.com> * Refs #19452: Remove Readme.html.in installation since it has been removed Signed-off-by: elianalf <62831776+elianalf@users.noreply.github.com> * Refs #19452: Remove fastrtps_example.cpp references Signed-off-by: elianalf <62831776+elianalf@users.noreply.github.com> * Refs #19452: Add head branch for discovery-server in github ci action Signed-off-by: elianalf <62831776+elianalf@users.noreply.github.com> * Refs 19452: Update default branch for asan Signed-off-by: elianalf <62831776+elianalf@users.noreply.github.com> * Refs #19452: Change Mac Github CI to work for 3.0.x-devel Signed-off-by: elianalf <62831776+elianalf@users.noreply.github.com> * Refs 19452: Add namespace where missing Signed-off-by: elianalf <62831776+elianalf@users.noreply.github.com> --------- Signed-off-by: JLBuenoLopez-eProsima Signed-off-by: elianalf <62831776+elianalf@users.noreply.github.com> Co-authored-by: elianalf <62831776+elianalf@users.noreply.github.com> Fixes after rebase Signed-off-by: JLBuenoLopez-eProsima --- .github/workflows/config/asan_colcon.meta | 3 +- .github/workflows/config/ci.meta | 4 +- .github/workflows/config/documentation.meta | 2 +- .github/workflows/config/tsan_colcon.meta | 3 +- .github/workflows/documentation-tests.yaml | 8 +- .github/workflows/mac-ci.yml | 4 +- .github/workflows/mirror.yml | 2 +- .github/workflows/nightly-mac-ci.yml | 2 +- .github/workflows/nightly-ubuntu-ci.yml | 2 +- .github/workflows/nightly-windows-ci.yml | 2 +- .github/workflows/reusable-mac-ci.yml | 12 +- .github/workflows/reusable-sanitizers-ci.yml | 48 +- .github/workflows/reusable-ubuntu-ci.yml | 14 +- .github/workflows/reusable-windows-ci.yml | 12 +- .github/workflows/ubuntu-ci.yml | 4 +- .github/workflows/windows-ci.yml | 4 +- .settings/org.eclipse.cdt.codan.core.prefs | 67 - CMakeLists.txt | 18 +- CTestJenkins.cmake | 88 - QUALITY.md | 2 +- README.md | 99 +- UPGRADING.md | 2 +- build_qnx/common.mk | 2 +- cmake/modules/FindTinyXML2.cmake | 2 +- cmake/packaging/Config.cmake.in | 68 +- cmake/packaging/windows/fastrtps-config.cmake | 4 +- colcon.pkg | 2 +- doc/README.html.in | 1273 --------- doc/design/intra-process.md | 93 - .../interprocess_shared_mem.md | 105 - .../interprocess_shared_mem1.png | Bin 86126 -> 0 bytes .../interprocess_shared_mem2.plantuml | 68 - .../interprocess_shared_mem2.png | Bin 37242 -> 0 bytes doc/pdf/FASTRTPSGEN - User Manual.odt | Bin 109970 -> 0 bytes doc/pdf/Fast RTPS - Installation Manual.odt | Bin 103394 -> 0 bytes doc/pdf/Fast RTPS - Latency Test.odt | Bin 153509 -> 0 bytes doc/pdf/Fast RTPS - Throughput Test.odt | Bin 148247 -> 0 bytes doc/pdf/Fast RTPS - User Manual.odt | Bin 281315 -> 0 bytes .../sony/PubSub_overview.png | Bin 48256 -> 0 bytes .../sony/RPC_overview.png | Bin 108738 -> 0 bytes .../sony/improvement.png | Bin 36300 -> 0 bytes .../sony/ms1_rtps_shared_memory_transport.md | 127 - .../ms2_rmw_shared_memory_data_share_sony.md | 87 - .../sony/rmw_sony_cpp.png | Bin 115480 -> 0 bytes examples/CMakeLists.txt | 2 +- .../AdvancedConfigurationPublisher.cpp | 8 +- .../AdvancedConfigurationSubscriber.cpp | 6 +- .../CMakeLists.txt | 6 +- .../AdvancedConfigurationExample/README.md | 4 +- .../arg_configuration.h | 2 +- .../AdvancedConfigurationExample/shm_off.xml | 2 +- .../BasicConfigurationPublisher.cpp | 6 +- .../BasicConfigurationSubscriber.cpp | 6 +- .../BasicConfigurationExample/CMakeLists.txt | 6 +- .../dds/BasicConfigurationExample/README.md | 2 +- .../arg_configuration.h | 2 +- .../cpp/dds/Configurability/CMakeLists.txt | 8 +- .../ConfigurabilityPublisher.cpp | 4 +- .../ConfigurabilitySubscriber.cpp | 4 +- .../CMakeLists.txt | 6 +- .../dds/CustomListenerExample/CMakeLists.txt | 6 +- .../CustomListenerPublisher.cpp | 11 +- .../CustomListenerSubscriber.cpp | 11 +- .../CustomListenerSubscriber.h | 10 +- .../CustomListener_main.cpp | 8 +- .../CustomListenerExample/CustomListeners.cpp | 20 +- .../CustomListenerExample/CustomListeners.h | 22 +- .../CustomPayloadPoolExample/CMakeLists.txt | 6 +- .../CustomPayloadPoolDataPublisher.cpp | 11 +- .../CustomPayloadPoolDataSubscriber.cpp | 8 +- .../CustomPayloadPoolDataSubscriber.h | 8 +- .../CustomPayloadPool_main.cpp | 9 +- .../cpp/dds/DeadlineQoSExample/CMakeLists.txt | 6 +- .../deadlinepayloadPubSubMain.cxx | 4 - .../deadlinepayloadSubscriber.h | 4 +- .../cpp/dds/DeadlineQoSExample/mapableKey.h | 56 - .../dds/DisablePositiveACKs/CMakeLists.txt | 6 +- .../DisablePositiveACKS_main.cpp | 6 +- .../dds/DiscoveryServerExample/CMakeLists.txt | 6 +- .../DiscoveryServerPublisher.cpp | 10 +- .../DiscoveryServerPublisher.h | 3 +- .../DiscoveryServerServer.cpp | 13 +- .../DiscoveryServerServer.h | 3 +- .../DiscoveryServerSubscriber.cpp | 14 +- .../DiscoveryServerSubscriber.h | 3 +- .../DynamicHelloWorldExample/CMakeLists.txt | 6 +- .../HelloWorldPublisher.cpp | 15 +- .../HelloWorldSubscriber.cpp | 2 - .../HelloWorldSubscriber.h | 17 +- .../HelloWorld_main.cpp | 2 +- .../helloworld_example_type_profile.xml | 2 +- examples/cpp/dds/Filtering/CMakeLists.txt | 6 +- .../Filtering/FilteringExamplePubSubMain.cxx | 4 - .../cpp/dds/FlowControlExample/CMakeLists.txt | 6 +- .../FlowControlExamplePubSubMain.cxx | 5 - .../cpp/dds/HelloWorldExample/CMakeLists.txt | 6 +- .../HelloWorldExample/HelloWorldPublisher.cpp | 11 +- .../HelloWorldSubscriber.cpp | 6 +- .../HelloWorldExample/HelloWorldSubscriber.h | 8 +- .../dds/HelloWorldExample/HelloWorld_main.cpp | 9 +- examples/cpp/dds/HelloWorldExample/README.txt | 6 +- .../CMakeLists.txt | 6 +- .../HelloWorldPublisher.cpp | 11 +- .../HelloWorldSubscriber.cpp | 2 - .../HelloWorldSubscriber.h | 8 +- .../HelloWorld_main.cpp | 7 +- .../HelloWorldExampleSharedMem/CMakeLists.txt | 6 +- .../HelloWorld_main.cpp | 12 +- .../dds/HelloWorldExampleTCP/CMakeLists.txt | 6 +- .../HelloWorldExampleTCP/HelloWorld_main.cpp | 10 +- examples/cpp/dds/HistoryKind/CMakeLists.txt | 6 +- examples/cpp/dds/Keys/CMakeLists.txt | 6 +- examples/cpp/dds/LateJoiners/CMakeLists.txt | 6 +- .../cpp/dds/LifespanQoSExample/CMakeLists.txt | 6 +- .../dds/LifespanQoSExample/Lifespan_main.cpp | 8 +- examples/cpp/dds/LivelinessQoS/CMakeLists.txt | 6 +- .../dds/LivelinessQoS/LivelinessPublisher.h | 12 +- .../LivelinessQoS/LivelinessSubscriber.cpp | 4 +- .../dds/LivelinessQoS/LivelinessSubscriber.h | 13 +- .../cpp/dds/LivelinessQoS/Liveliness_main.cpp | 25 +- .../CMakeLists.txt | 6 +- .../OwnershipStrengthPubSubMain.cxx | 10 +- .../OwnershipStrengthSubscriber.cxx | 2 +- .../dds/RequestReplyExample/CMakeLists.txt | 8 +- .../RequestReplyExample/CalculatorClient.cpp | 9 +- .../RequestReplyExample/CalculatorServer.cpp | 9 +- .../SampleConfig_Controller/CMakeLists.txt | 6 +- .../dds/SampleConfig_Events/CMakeLists.txt | 6 +- .../cpp/dds/SampleConfig_Events/README.txt | 2 +- .../SampleConfig_Multimedia/CMakeLists.txt | 6 +- .../dds/SampleConfig_Multimedia/README.txt | 2 +- .../SecureHelloWorldExample/CMakeLists.txt | 6 +- .../HelloWorld_main.cpp | 8 +- .../StaticHelloWorldExample/CMakeLists.txt | 6 +- .../HelloWorld_main.cpp | 8 +- .../cpp/dds/TypeLookupService/CMakeLists.txt | 6 +- .../TypeLookupService/TypeLookupPublisher.cpp | 15 +- .../TypeLookupSubscriber.cpp | 7 - .../TypeLookupService/TypeLookupSubscriber.h | 13 +- .../dds/TypeLookupService/TypeLookup_main.cpp | 5 +- .../example_type_profile.xml | 2 +- .../cpp/dds/WriterLoansExample/CMakeLists.txt | 6 +- .../cpp/dds/ZeroCopyExample/CMakeLists.txt | 6 +- examples/cpp/rtps/AsSocket/CMakeLists.txt | 6 +- .../cpp/rtps/AsSocket/TestReaderSocket.cpp | 18 +- examples/cpp/rtps/AsSocket/TestReaderSocket.h | 6 +- .../cpp/rtps/AsSocket/TestWriterSocket.cpp | 21 +- examples/cpp/rtps/AsSocket/TestWriterSocket.h | 9 +- examples/cpp/rtps/AsSocket/main_RTPSTest.cpp | 12 +- examples/cpp/rtps/Persistent/CMakeLists.txt | 6 +- .../rtps/Persistent/TestReaderPersistent.cpp | 21 +- .../rtps/Persistent/TestReaderPersistent.h | 6 +- .../rtps/Persistent/TestWriterPersistent.cpp | 18 +- .../rtps/Persistent/TestWriterPersistent.h | 6 +- .../cpp/rtps/Persistent/main_RTPSTest.cpp | 14 +- examples/cpp/rtps/Registered/CMakeLists.txt | 6 +- .../rtps/Registered/TestReaderRegistered.cpp | 23 +- .../rtps/Registered/TestReaderRegistered.h | 6 +- .../rtps/Registered/TestWriterRegistered.cpp | 20 +- .../rtps/Registered/TestWriterRegistered.h | 6 +- .../cpp/rtps/Registered/main_RTPSTest.cpp | 14 +- fastrtps.repos => fastdds.repos | 2 +- fuzz/C++/fuzz_XMLProfiles/CMakeLists.txt | 6 +- .../1c82a2c60044985396a5dbbe58ad7fcc5d852d38 | 2 +- fuzz/C++/fuzz_processCDRMsg/CMakeLists.txt | 6 +- .../fuzz_processCDRMsg/fuzz_processCDRMsg.cxx | 2 +- fuzz/CMakeLists.txt | 2 +- include/dds/core/BuiltinTopicTypes.hpp | 220 -- include/dds/core/Duration.hpp | 296 --- include/dds/core/Entity.hpp | 273 -- include/dds/core/EntityQos.hpp | 143 - include/dds/core/Exception.hpp | 479 ---- include/dds/core/InstanceHandle.hpp | 143 - include/dds/core/LengthUnlimited.hpp | 34 - include/dds/core/Optional.hpp | 105 - include/dds/core/QosProvider.hpp | 355 --- include/dds/core/Reference.hpp | 485 ---- include/dds/core/SafeEnumeration.hpp | 97 - include/dds/core/Time.hpp | 234 -- include/dds/core/Value.hpp | 238 -- include/dds/core/WeakReference.hpp | 87 - include/dds/core/array.hpp | 33 - include/dds/core/cond/Condition.hpp | 148 -- include/dds/core/cond/GuardCondition.hpp | 142 - include/dds/core/cond/StatusCondition.hpp | 242 -- include/dds/core/cond/WaitSet.hpp | 427 --- include/dds/core/cond/detail/Condition.hpp | 45 - .../dds/core/cond/detail/ConditionImpl.hpp | 92 - .../dds/core/cond/detail/GuardCondition.hpp | 50 - .../core/cond/detail/GuardConditionImpl.hpp | 130 - .../dds/core/cond/detail/StatusCondition.hpp | 49 - .../core/cond/detail/StatusConditionImpl.hpp | 132 - include/dds/core/cond/detail/WaitSet.hpp | 44 - include/dds/core/cond/detail/WaitSetImpl.hpp | 149 -- include/dds/core/conformance.hpp | 25 - include/dds/core/ddscore.hpp | 38 - include/dds/core/detail/BuiltinTopicTypes.hpp | 236 -- include/dds/core/detail/Entity.hpp | 40 - include/dds/core/detail/EntityQosImpl.hpp | 131 - include/dds/core/detail/InstanceHandle.hpp | 40 - include/dds/core/detail/QosProvider.hpp | 43 - include/dds/core/detail/QosProviderImpl.hpp | 153 -- include/dds/core/detail/ReferenceImpl.hpp | 257 -- include/dds/core/detail/Value.hpp | 203 -- include/dds/core/detail/WeakReferenceImpl.hpp | 71 - include/dds/core/detail/array.hpp | 34 - include/dds/core/detail/conformance.hpp | 44 - include/dds/core/detail/dds_builtinTopics.h | 98 - .../core/detail/dds_builtinTopicsSplDcps.h | 577 ---- .../core/detail/dds_builtinTopics_DCPS.hpp | 26 - .../dds/core/detail/dds_dcps_builtintopics.h | 41 - .../detail/dds_dcps_builtintopicsSplDcps.h | 178 -- .../detail/dds_dcps_builtintopics_DCPS.hpp | 24 - include/dds/core/detail/ddscore.hpp | 23 - include/dds/core/detail/inttypes.hpp | 24 - include/dds/core/detail/macros.hpp | 44 - include/dds/core/detail/module_docs.hpp | 165 -- include/dds/core/detail/old_win_stdint.h | 247 -- include/dds/core/detail/ref_traits.hpp | 67 - include/dds/core/macros.hpp | 56 - include/dds/core/policy/CorePolicy.hpp | 1705 ------------ include/dds/core/policy/PolicyKind.hpp | 255 -- include/dds/core/policy/QosPolicyCount.hpp | 93 - include/dds/core/policy/detail/CorePolicy.hpp | 98 - .../dds/core/policy/detail/CorePolicyImpl.hpp | 1424 ---------- .../dds/core/policy/detail/QosPolicyCount.hpp | 46 - include/dds/core/ref_traits.hpp | 59 - include/dds/core/refmacros.hpp | 186 -- include/dds/core/status/State.hpp | 168 -- include/dds/core/status/Status.hpp | 449 ---- include/dds/core/status/detail/Status.hpp | 68 - include/dds/core/status/detail/StatusImpl.hpp | 414 --- include/dds/core/types.hpp | 67 - include/dds/core/xtypes/Annotation.hpp | 283 -- include/dds/core/xtypes/AnnotationKind.hpp | 47 - include/dds/core/xtypes/CollectionTypes.hpp | 142 - include/dds/core/xtypes/DynamicData.hpp | 118 - include/dds/core/xtypes/DynamicType.hpp | 171 -- include/dds/core/xtypes/MemberType.hpp | 165 -- include/dds/core/xtypes/PrimitiveTypes.hpp | 74 - include/dds/core/xtypes/StructType.hpp | 203 -- include/dds/core/xtypes/TypeKind.hpp | 79 - include/dds/core/xtypes/TypeProvider.hpp | 77 - include/dds/core/xtypes/UnionCase.hpp | 69 - include/dds/core/xtypes/UnionType.hpp | 141 - include/dds/core/xtypes/detail/Annotation.hpp | 226 -- .../core/xtypes/detail/CollectionTypes.hpp | 47 - .../dds/core/xtypes/detail/DynamicData.hpp | 35 - .../dds/core/xtypes/detail/DynamicType.hpp | 101 - include/dds/core/xtypes/detail/MemberType.hpp | 245 -- .../dds/core/xtypes/detail/PrimitiveTypes.hpp | 131 - include/dds/core/xtypes/detail/StructType.hpp | 187 -- .../dds/core/xtypes/detail/TypeProvider.hpp | 35 - include/dds/core/xtypes/detail/UnionCase.hpp | 36 - include/dds/core/xtypes/detail/UnionType.hpp | 36 - include/dds/domain/DomainParticipant.hpp | 505 ---- .../dds/domain/DomainParticipantListener.hpp | 236 -- .../dds/domain/detail/DomainParticipant.hpp | 34 - .../dds/domain/qos/DomainParticipantQos.hpp | 36 - .../qos/detail/DomainParticipantQos.hpp | 35 - include/dds/pub/AnyDataWriter.hpp | 373 --- include/dds/pub/DataWriter.hpp | 1611 ----------- include/dds/pub/Publisher.hpp | 331 --- include/dds/pub/PublisherListener.hpp | 157 -- include/dds/pub/detail/AnyDataWriter.hpp | 41 - include/dds/pub/detail/DataWriter.hpp | 41 - include/dds/pub/detail/Publisher.hpp | 48 - include/dds/pub/qos/DataWriterQos.hpp | 35 - include/dds/pub/qos/PublisherQos.hpp | 35 - include/dds/pub/qos/detail/DataWriterQos.hpp | 35 - include/dds/pub/qos/detail/PublisherQos.hpp | 35 - include/dds/sub/DataReader.hpp | 217 -- include/dds/sub/DataReaderListener.hpp | 107 - include/dds/sub/Subscriber.hpp | 268 -- include/dds/sub/SubscriberListener.hpp | 154 -- include/dds/sub/detail/DataReader.hpp | 40 - include/dds/sub/detail/Subscriber.hpp | 48 - include/dds/sub/qos/DataReaderQos.hpp | 32 - include/dds/sub/qos/SubscriberQos.hpp | 32 - include/dds/sub/qos/detail/DataReaderQos.hpp | 35 - include/dds/sub/qos/detail/SubscriberQos.hpp | 35 - include/dds/topic/Topic.hpp | 111 - include/dds/topic/TopicListener.hpp | 107 - include/dds/topic/detail/Topic.hpp | 40 - include/dds/topic/qos/TopicQos.hpp | 36 - include/dds/topic/qos/detail/TopicQos.hpp | 35 - include/{fastrtps => fastdds}/config.h.in | 30 +- .../dds/builtin/common/ReplyHeader.hpp | 20 +- .../dds/builtin/common/RequestHeader.hpp | 20 +- .../typelookup/TypeLookupReplyListener.hpp | 4 +- .../typelookup/TypeLookupRequestListener.hpp | 4 +- .../dds/core/status/IncompatibleQosStatus.hpp | 10 +- .../fastdds/dds/domain/DomainParticipant.hpp | 2 +- .../dds/domain/DomainParticipantFactory.hpp | 11 +- .../dds/domain/DomainParticipantListener.hpp | 16 - include/fastdds/dds/publisher/DataWriter.hpp | 38 +- .../dds/publisher/DataWriterListener.hpp | 6 +- .../dds/publisher/PublisherListener.hpp | 2 +- .../dds/publisher/qos/PublisherQos.hpp | 1 - .../fastdds/dds/publisher/qos/WriterQos.hpp | 2 +- .../dds/subscriber/DataReaderListener.hpp | 22 +- include/fastdds/dds/subscriber/SampleInfo.hpp | 28 - .../dds/subscriber/SubscriberListener.hpp | 6 +- .../fastdds/dds/subscriber/qos/ReaderQos.hpp | 2 +- .../dds/subscriber/qos/SubscriberQos.hpp | 1 - include/fastdds/dds/topic/TopicDataType.hpp | 3 +- .../rtps/attributes/EndpointAttributes.h | 13 +- .../attributes/RTPSParticipantAttributes.h | 22 - .../rtps/attributes/ReaderAttributes.h | 6 +- .../rtps/attributes/ServerAttributes.h | 18 +- .../rtps/attributes/WriterAttributes.h | 16 +- .../rtps/builtin/data/ParticipantProxyData.h | 12 +- .../rtps/builtin/data/ReaderProxyData.h | 6 +- .../rtps/builtin/data/WriterProxyData.h | 5 +- .../rtps/builtin/discovery/endpoint/EDP.h | 8 +- .../rtps/builtin/discovery/participant/PDP.h | 2 +- include/fastdds/rtps/builtin/liveliness/WLP.h | 17 +- .../rtps/builtin/liveliness/WLPListener.h | 2 +- include/fastdds/rtps/common/Locator.h | 15 - include/fastdds/rtps/common/LocatorList.hpp | 35 +- .../fastdds/rtps/common/LocatorSelector.hpp | 1 + .../rtps/common/LocatorSelectorEntry.hpp | 1 + .../fastdds/rtps/common/LocatorsIterator.hpp | 8 + include/fastdds/rtps/common/Types.h | 2 +- include/fastdds/rtps/history/History.h | 42 - .../rtps/participant/RTPSParticipant.h | 14 +- include/fastdds/rtps/reader/RTPSReader.h | 4 +- .../fastdds/rtps/security/logging/Logging.h | 18 +- .../transport/ChainingTransportDescriptor.h | 2 +- .../fastdds/rtps/transport/SenderResource.h | 3 +- .../rtps/transport/TCPTransportDescriptor.h | 4 - .../rtps/transport/TransportInterface.h | 3 +- .../fastdds/rtps/writer/IReaderDataFilter.hpp | 22 - include/fastdds/rtps/writer/LivelinessData.h | 27 +- .../fastdds/rtps/writer/LivelinessManager.h | 12 +- include/fastdds/rtps/writer/RTPSWriter.h | 9 +- include/fastrtps/config/doxygen_modules.h | 48 +- include/fastrtps/eProsima_auto_link.h | 37 +- include/fastrtps/fastrtps_dll.h | 50 +- include/fastrtps/publisher/Publisher.h | 4 - .../fastrtps/publisher/PublisherListener.h | 2 - include/fastrtps/subscriber/Subscriber.h | 2 - .../fastrtps/subscriber/SubscriberListener.h | 113 +- .../fastrtps/types/AnnotationParameterValue.h | 150 -- include/fastrtps/types/TypeIdentifier.h | 32 - include/fastrtps/types/TypeIdentifierTypes.h | 363 --- include/fastrtps/types/TypeObject.h | 1345 ---------- include/fastrtps/utils/IPFinder.h | 5 +- include/fastrtps/utils/System.h | 44 - .../fastrtps/utils/TimedConditionVariable.hpp | 3 +- .../collections/foonathan_memory_helpers.hpp | 74 - include/fastrtps/utils/shared_mutex.hpp | 2 +- include/fastrtps/xmlparser/XMLParserCommon.h | 4 +- m4/ax_check_openssl.m4 | 124 - m4/ax_cxx_compile_stdcxx_0x.m4 | 109 - m4/ax_cxx_compile_stdcxx_11.m4 | 167 -- package.xml | 6 +- .../images/fastdds_github_banner.png | Bin .../images/logo/eProsimaLogo.jpg | Bin .../images/logo/eProsimaLogo.png | Bin ...RTPS_profiles.xsd => fastdds_profiles.xsd} | 4 +- src/cpp/CMakeLists.txt | 337 ++- src/cpp/dds/core/Exception.cpp | 77 - src/cpp/dds/core/types.cpp | 24 - src/cpp/dds/domain/DomainParticipant.cpp | 214 -- src/cpp/dds/pub/AnyDataWriter.cpp | 137 - src/cpp/dds/pub/DataWriter.cpp | 410 --- src/cpp/dds/pub/Publisher.cpp | 141 - src/cpp/dds/sub/DataReader.cpp | 111 - src/cpp/dds/sub/Subscriber.cpp | 135 - src/cpp/dds/topic/Topic.cpp | 69 - .../AnnotationParameterValue.cpp | 90 - src/cpp/dynamic-types/TypeIdentifier.cpp | 21 - src/cpp/dynamic-types/TypeIdentifierTypes.cpp | 231 -- src/cpp/dynamic-types/TypeObject.cpp | 1751 +----------- .../fastdds/builtin/common/RPCHeadersImpl.cpp | 76 - .../typelookup/TypeLookupReplyListener.cpp | 11 +- .../typelookup/TypeLookupRequestListener.cpp | 16 +- .../typelookup/common/TypeLookupTypes.cpp | 4 + src/cpp/fastdds/core/policy/ParameterList.cpp | 2 +- .../fastdds/domain/DomainParticipantImpl.cpp | 4 - .../fastdds/domain/DomainParticipantImpl.hpp | 4 +- src/cpp/fastdds/publisher/DataWriter.cpp | 42 - .../fastdds/publisher/DataWriterHistory.hpp | 2 +- src/cpp/fastdds/publisher/DataWriterImpl.cpp | 8 +- src/cpp/fastdds/publisher/DataWriterImpl.hpp | 23 +- src/cpp/fastdds/publisher/PublisherImpl.cpp | 2 +- src/cpp/fastdds/publisher/PublisherImpl.hpp | 19 +- src/cpp/fastdds/subscriber/DataReaderImpl.cpp | 14 +- src/cpp/fastdds/subscriber/DataReaderImpl.hpp | 26 +- .../DataReaderImpl/ReadTakeCommand.hpp | 2 +- src/cpp/fastdds/subscriber/SubscriberImpl.cpp | 6 +- src/cpp/fastdds/subscriber/SubscriberImpl.hpp | 10 +- src/cpp/fastrtps.rc | 10 +- src/cpp/fastrtps_deprecated/Domain.cpp | 449 ---- .../participant/Participant.cpp | 68 - .../participant/ParticipantImpl.cpp | 555 ---- .../participant/ParticipantImpl.h | 250 -- .../publisher/Publisher.cpp | 129 - .../publisher/PublisherHistory.cpp | 520 ---- .../publisher/PublisherImpl.cpp | 637 ----- .../publisher/PublisherImpl.h | 296 --- .../subscriber/Subscriber.cpp | 97 - .../subscriber/SubscriberHistory.cpp | 835 ------ .../subscriber/SubscriberImpl.cpp | 494 ---- .../subscriber/SubscriberImpl.h | 272 -- src/cpp/libfastdds.version | 4 + src/cpp/libfastrtps.version | 4 - src/cpp/rtps/RTPSDomain.cpp | 1 - src/cpp/rtps/RTPSDomainImpl.hpp | 9 +- .../attributes/TopicAttributes.cpp | 0 src/cpp/rtps/builtin/BuiltinProtocols.cpp | 8 +- .../rtps/builtin/discovery/endpoint/EDP.cpp | 8 +- .../builtin/discovery/endpoint/EDPSimple.cpp | 40 +- .../participant/DirectMessageSender.hpp | 8 +- .../participant/PDPServerListener.cpp | 2 +- src/cpp/rtps/builtin/liveliness/WLP.cpp | 4 +- .../rtps/builtin/liveliness/WLPListener.cpp | 2 +- .../history/HistoryAttributesExtension.hpp | 18 +- src/cpp/rtps/messages/RTPSGapBuilder.hpp | 6 +- src/cpp/rtps/messages/RTPSMessageGroup_t.hpp | 22 +- src/cpp/rtps/messages/submessages/DataMsg.hpp | 24 +- src/cpp/rtps/network/NetworkFactory.h | 2 +- src/cpp/rtps/participant/RTPSParticipant.cpp | 8 +- .../rtps/participant/RTPSParticipantImpl.cpp | 2 +- .../rtps/participant/RTPSParticipantImpl.h | 10 +- src/cpp/rtps/reader/ReaderHistoryState.hpp | 6 +- .../rtps/reader/StatefulPersistentReader.cpp | 3 +- .../rtps/reader/StatelessPersistentReader.cpp | 3 +- src/cpp/rtps/reader/WriterProxy.cpp | 2 +- src/cpp/rtps/reader/WriterProxy.h | 10 +- src/cpp/rtps/security/SecurityManager.cpp | 18 +- src/cpp/rtps/security/SecurityManager.h | 2 +- src/cpp/rtps/transport/ChannelResource.cpp | 2 +- src/cpp/rtps/transport/TCPAcceptor.cpp | 2 +- src/cpp/rtps/transport/TCPAcceptorBasic.cpp | 2 +- src/cpp/rtps/transport/TCPAcceptorSecure.cpp | 2 +- src/cpp/rtps/transport/TCPChannelResource.cpp | 2 +- .../transport/TCPChannelResourceBasic.cpp | 2 +- .../transport/TCPChannelResourceSecure.cpp | 2 +- src/cpp/rtps/transport/TCPSenderResource.hpp | 2 +- .../rtps/transport/TCPTransportInterface.cpp | 9 +- src/cpp/rtps/transport/TCPv4Transport.cpp | 2 +- src/cpp/rtps/transport/TCPv6Transport.cpp | 2 +- src/cpp/rtps/transport/UDPChannelResource.cpp | 2 +- src/cpp/rtps/transport/UDPSenderResource.hpp | 2 +- .../rtps/transport/UDPTransportInterface.cpp | 2 +- src/cpp/rtps/transport/UDPv4Transport.cpp | 2 +- src/cpp/rtps/transport/UDPv6Transport.cpp | 2 +- .../shared_mem/SharedMemChannelResource.hpp | 3 +- .../shared_mem/SharedMemTransport.cpp | 6 +- .../rtps/transport/tcp/RTCPMessageManager.cpp | 3 +- .../rtps/transport/test_UDPv4Transport.cpp | 2 +- src/cpp/rtps/writer/LivelinessManager.cpp | 20 +- src/cpp/rtps/writer/PersistentWriter.cpp | 5 +- .../rtps/writer/StatefulPersistentWriter.cpp | 3 +- .../rtps/writer/StatelessPersistentWriter.cpp | 3 +- src/cpp/rtps/xmlparser/XMLParser.cpp | 40 +- src/cpp/rtps/xmlparser/XMLParserCommon.cpp | 4 +- src/cpp/rtps/xmlparser/XMLProfileManager.cpp | 10 +- .../accesscontrol/DistinguishedName.cpp | 2 +- .../fastdds/domain/DomainParticipantImpl.hpp | 2 +- .../DomainParticipantStatisticsListener.hpp | 2 +- src/cpp/statistics/rtps/GuidUtils.hpp | 2 +- src/cpp/statistics/rtps/StatisticsBase.cpp | 6 +- src/cpp/statistics/rtps/StatisticsBase.hpp | 6 +- .../rtps/messages/OutputTrafficManager.hpp | 3 +- .../rtps/monitor-service/MonitorService.cpp | 2 +- .../rtps/monitor-service/MonitorService.hpp | 2 +- src/cpp/utils/Host.hpp | 8 +- src/cpp/utils/System.cpp | 32 - src/cpp/utils/collections/FixedSizeQueue.hpp | 6 +- src/cpp/utils/collections/ObjectPool.hpp | 6 +- src/cpp/utils/collections/concurrent_queue.h | 11 +- test/CMakeLists.txt | 3 +- test/blackbox/CMakeLists.txt | 4 +- .../MonitorServiceConnectionList_profile.xml | 2 +- ...onitorServiceDomainParticipant_profile.xml | 2 +- .../StatisticsDomainParticipant_profile.xml | 2 +- .../api/dds-pim/PubSubParticipant.hpp | 4 +- test/blackbox/api/dds-pim/PubSubReader.hpp | 24 +- test/blackbox/api/dds-pim/PubSubWriter.hpp | 20 +- .../api/dds-pim/PubSubWriterReader.hpp | 28 +- .../ReqRepAsReliableHelloWorldReplier.hpp | 4 +- .../ReqRepAsReliableHelloWorldRequester.hpp | 8 +- .../blackbox/auth_handshake_props_profile.xml | 2 +- test/blackbox/builtin_transports_profile.xml | 2 +- test/blackbox/common/BlackboxTests.cpp | 2 +- .../common/BlackboxTestsDiscovery.cpp | 70 +- test/blackbox/common/BlackboxTestsKeys.cpp | 10 +- .../common/BlackboxTestsLifespanQoS.cpp | 10 +- .../common/BlackboxTestsLivelinessQos.cpp | 6 +- .../common/BlackboxTestsNetworkConf.cpp | 24 +- .../common/BlackboxTestsPubSubBasic.cpp | 38 +- .../BlackboxTestsPubSubFlowControllers.cpp | 22 +- .../common/BlackboxTestsPubSubFragments.cpp | 58 +- .../common/BlackboxTestsPubSubHistory.cpp | 144 +- .../BlackboxTestsRealtimeAllocations.cpp | 36 +- .../common/BlackboxTestsReliability.cpp | 8 +- .../blackbox/common/BlackboxTestsSecurity.cpp | 124 +- .../common/BlackboxTestsTransportCustom.cpp | 12 +- .../common/BlackboxTestsTransportSHM.cpp | 52 +- .../common/BlackboxTestsTransportTCP.cpp | 80 +- .../common/BlackboxTestsTransportUDP.cpp | 6 +- .../blackbox/common/BlackboxTestsVolatile.cpp | 132 +- .../common/DDSBlackboxTestsAckPositive.cpp | 41 +- .../blackbox/common/DDSBlackboxTestsBasic.cpp | 4 +- .../common/DDSBlackboxTestsDataSharing.cpp | 39 +- .../common/DDSBlackboxTestsDataWriter.cpp | 8 +- .../common/DDSBlackboxTestsDiscovery.cpp | 15 +- .../common/DDSBlackboxTestsMonitorService.cpp | 15 +- .../common/DDSBlackboxTestsOwnershipQos.cpp | 13 +- .../common/DDSBlackboxTestsPersistence.cpp | 51 +- .../common/DDSBlackboxTestsSecurity.cpp | 4 +- .../common/DDSBlackboxTestsStatistics.cpp | 2 +- .../DDSBlackboxTestsTransportSHMUDP.cpp | 26 +- test/blackbox/common/RTPSAsSocketReader.hpp | 44 +- test/blackbox/common/RTPSAsSocketWriter.hpp | 35 +- test/blackbox/common/RTPSBlackboxTests.cpp | 22 +- .../common/RTPSBlackboxTestsBasic.cpp | 24 +- .../common/RTPSWithRegistrationReader.hpp | 39 +- .../common/RTPSWithRegistrationWriter.hpp | 6 +- .../discovery_participant_flags_profile.xml | 2 +- test/blackbox/partitions_profile.xml | 2 +- test/dds/communication/CMakeLists.txt | 10 +- test/dds/communication/PubSubMain.cpp | 7 +- test/dds/communication/PublisherDynamic.cpp | 6 +- test/dds/communication/PublisherMain.cpp | 4 +- test/dds/communication/PublisherModule.cpp | 3 +- test/dds/communication/PublisherModule.hpp | 3 +- test/dds/communication/SubscriberDynamic.cpp | 16 +- test/dds/communication/SubscriberMain.cpp | 4 +- test/dds/communication/SubscriberModule.cpp | 3 +- test/dds/communication/SubscriberModule.hpp | 3 +- test/dds/communication/TCP_client_profile.xml | 2 +- test/dds/communication/TCP_server_profile.xml | 2 +- .../communication/example_type_profile.xml | 2 +- .../liveliness_assertion.120_profile.xml | 2 +- .../liveliness_assertion.360_profile.xml | 2 +- .../liveliness_assertion_profile.xml | 2 +- .../dds/communication/security/CMakeLists.txt | 4 +- .../communication/security/PublisherMain.cpp | 1 - .../security/PublisherModule.cpp | 3 +- .../security/PublisherModule.hpp | 8 +- .../communication/security/SubscriberMain.cpp | 1 - .../security/SubscriberModule.cpp | 3 +- .../security/SubscriberModule.hpp | 3 +- ...ple_secure_msg_crypto_ds_1_sub_profile.xml | 2 +- ...s_simple_secure_msg_crypto_pub_profile.xml | 2 +- ...s_simple_secure_msg_crypto_sub_profile.xml | 2 +- ...ry_no_rtps_protection_ds_1_sub_profile.xml | 2 +- ...scovery_no_rtps_protection_pub_profile.xml | 2 +- ...scovery_no_rtps_protection_sub_profile.xml | 2 +- ..._discovery_protection_ds_1_sub_profile.xml | 2 +- ...re_no_discovery_protection_pub_profile.xml | 2 +- ...re_no_discovery_protection_sub_profile.xml | 2 +- ...re_no_rtps_protection_ds_1_sub_profile.xml | 2 +- ..._secure_no_rtps_protection_pub_profile.xml | 2 +- ..._secure_no_rtps_protection_sub_profile.xml | 2 +- ...cure_msg_crypto_besteffort_pub_profile.xml | 2 +- ...cure_msg_crypto_besteffort_sub_profile.xml | 2 +- ...g_submsg_crypto_besteffort_pub_profile.xml | 2 +- ...g_submsg_crypto_besteffort_sub_profile.xml | 2 +- .../secure_simple_ds_server_idx_1_profile.xml | 2 +- ...overy_no_rtps_protection_idx_1_profile.xml | 2 +- ...o_discovery_no_rtps_protection_profile.xml | 2 +- ..._no_discovery_protection_idx_1_profile.xml | 2 +- ...server_no_discovery_protection_profile.xml | 2 +- ...erver_no_rtps_protection_idx_1_profile.xml | 2 +- ...e_ds_server_no_rtps_protection_profile.xml | 2 +- .../secure_simple_ds_server_profile.xml | 2 +- ...e_submsg_crypto_besteffort_pub_profile.xml | 2 +- ...e_submsg_crypto_besteffort_sub_profile.xml | 2 +- ...mple_allow_unauthenticated_sub_profile.xml | 2 +- ...cure_allow_unauthenticated_pub_profile.xml | 2 +- .../simple_secure_besteffort_pub_profile.xml | 2 +- .../simple_secure_besteffort_sub_profile.xml | 2 +- ..._dies_while_processing_message_profile.xml | 2 +- .../simple_besteffort_profile.xml | 2 +- .../simple_besteffort_zerocopy_profile.xml | 2 +- .../communication/simple_reliable_profile.xml | 2 +- .../simple_reliable_zerocopy_profile.xml | 2 +- test/dds/discovery/CMakeLists.txt | 2 +- test/dds/discovery/ParticipantModule.cpp | 4 +- test/dds/discovery/ParticipantModule.hpp | 3 +- .../fastdds/dds/core/policy/QosPolicies.hpp | 9 +- .../rtps/builtin/discovery/endpoint/EDP.h | 14 +- .../fastdds/rtps/messages/MessageReceiver.h | 7 +- .../rtps/network/NetworkFactory.h | 8 +- .../rtps/builtin/discovery/participant/PDP.h | 12 +- .../builtin/discovery/participant/PDPSimple.h | 10 +- .../rtps/builtin/data/ParticipantProxyData.h | 14 +- .../rtps/messages/RTPSGapBuilder.hpp | 2 +- .../rtps/participant/RTPSParticipant.h | 20 +- .../attributes/RTPSParticipantAttributes.h | 28 +- .../rtps/participant/RTPSParticipantImpl.h | 23 +- .../fastdds/rtps/reader/RTPSReader.h | 17 +- .../fastdds/rtps/writer/RTPSWriter.h | 11 +- .../fastdds/rtps/history/ReaderHistory.h | 10 +- .../fastdds/rtps/writer/ReaderLocator.h | 12 +- .../rtps/builtin/data/ReaderProxyData.h | 39 +- .../rtps/network/ReceiverResource.h | 11 +- .../rtps/security/SecurityManager.h | 6 +- .../rtps/security/MockAuthenticationPlugin.h | 7 +- .../rtps/security/MockCryptoKeyExchange.h | 41 +- .../rtps/security/MockCryptoKeyFactory.h | 8 +- .../rtps/security/MockCryptoTransform.h | 5 +- .../rtps/security/MockCryptographyPlugin.h | 4 +- .../rtps/security/SecurityPluginFactory.h | 8 +- .../fastdds/rtps/reader/StatefulReader.h | 6 +- .../fastdds/rtps/writer/StatefulWriter.h | 6 +- .../fastdds/rtps/reader/StatelessReader.h | 2 +- .../fastdds/rtps/writer/StatelessWriter.h | 2 +- .../rtps}/transport/TCPTransportDescriptor.h | 12 +- .../rtps/transport/TCPv4TransportDescriptor.h | 86 + .../transport/TCPv4TransportDescriptor.h | 71 - .../transport/TCPv6TransportDescriptor.h | 31 +- .../fastdds/rtps/resources/TimedEvent.h | 6 +- .../rtps}/transport/UDPTransportDescriptor.h | 50 +- .../transport/UDPv4TransportDescriptor.h | 40 +- .../transport/UDPv6TransportDescriptor.h | 40 +- .../WLP/fastdds/rtps/builtin/liveliness/WLP.h | 5 +- .../fastdds/rtps/history/WriterHistory.h | 10 +- .../rtps/builtin/data/WriterProxyData.h | 42 +- test/performance/CMakeLists.txt | 3 +- test/performance/latency/CMakeLists.txt | 2 +- .../latency/LatencyTestPublisher.cpp | 4 +- .../latency/LatencyTestPublisher.hpp | 3 +- .../latency/LatencyTestSubscriber.cpp | 4 +- test/performance/latency/README.md | 12 +- test/performance/latency/latency_tests.py | 6 +- test/performance/latency/main_LatencyTest.cpp | 19 +- ...y_interprocess_best_effort_shm_profile.xml | 2 +- ...y_interprocess_best_effort_tcp_profile.xml | 2 +- ...y_interprocess_best_effort_udp_profile.xml | 2 +- ...ency_interprocess_reliable_shm_profile.xml | 2 +- ...ency_interprocess_reliable_tcp_profile.xml | 2 +- ...ency_interprocess_reliable_udp_profile.xml | 2 +- ...tency_intraprocess_best_effort_profile.xml | 2 +- .../latency_intraprocess_reliable_profile.xml | 2 +- test/performance/throughput/CMakeLists.txt | 2 +- test/performance/throughput/README.md | 14 +- .../throughput/ThroughputPublisher.cpp | 4 +- .../throughput/ThroughputPublisher.hpp | 14 +- .../throughput/ThroughputSubscriber.cpp | 4 +- .../throughput/ThroughputSubscriber.hpp | 4 +- .../throughput/ThroughputTypes.hpp | 14 +- .../throughput/main_ThroughputTest.cpp | 18 +- .../throughput/throughput_tests.py | 6 +- ...t_interprocess_best_effort_shm_profile.xml | 2 +- ...t_interprocess_best_effort_tcp_profile.xml | 2 +- ...t_interprocess_best_effort_udp_profile.xml | 2 +- ...hput_interprocess_reliable_shm_profile.xml | 2 +- ...hput_interprocess_reliable_tcp_profile.xml | 2 +- ...hput_interprocess_reliable_udp_profile.xml | 2 +- ...ghput_intraprocess_best_effort_profile.xml | 2 +- ...roughput_intraprocess_reliable_profile.xml | 2 +- test/performance/video/CMakeLists.txt | 4 +- test/performance/video/VideoTestPublisher.cpp | 29 +- .../performance/video/VideoTestSubscriber.cpp | 2 +- test/performance/video/main_VideoTest.cpp | 7 +- test/performance/video/video_tests.py | 2 +- ...video_interprocess_best_effort_profile.xml | 2 +- ...o_interprocess_best_effort_tcp_profile.xml | 2 +- .../video_interprocess_reliable_profile.xml | 2 +- ...ideo_interprocess_reliable_tcp_profile.xml | 2 +- test/profiling/CMakeLists.txt | 2 +- test/profiling/MemoryTestPublisher.cpp | 7 +- test/profiling/MemoryTestSubscriber.cpp | 4 +- test/profiling/MemoryTestTypes.h | 160 +- test/profiling/RTPSProfilingCommon.h | 8 +- .../profiling/allocations/AllocTestCommon.cpp | 37 +- test/profiling/allocations/AllocTestCommon.h | 9 +- test/profiling/allocations/AllocTest_main.cpp | 50 +- test/profiling/allocations/CMakeLists.txt | 4 +- .../allocations/test_xml_profile.xml | 2 +- test/profiling/main_MemoryTest.cpp | 4 +- test/realtime/CMakeLists.txt | 4 +- test/realtime/UserThreadNonBlockedTest.cpp | 9 +- test/system/tools/fastdds/tests.py | 6 +- test/system/tools/fds/CMakeLists.txt | 2 +- ...est_wrong_xml_discovery_server_profile.xml | 2 +- .../fds/test_xml_discovery_server_profile.xml | 2 +- ...st_xml_secure_discovery_server_profile.xml | 2 +- test/system/tools/fds/tests.py | 2 +- .../XMLTesterExample_profile.xml | 2 +- .../tools/xmlvalidation/all_profile.xml | 2 +- .../xmlvalidation/dataReader_profile.xml | 2 +- .../xmlvalidation/dataWriter_profile.xml | 2 +- .../domainParticipant_profile.xml | 2 +- .../xmlvalidation/librarySettings_profile.xml | 2 +- .../tools/xmlvalidation/log_profile.xml | 2 +- .../tools/xmlvalidation/topic_profile.xml | 2 +- .../transportDescriptor_profile.xml | 2 +- .../tools/xmlvalidation/types_profile.xml | 2 +- test/unittest/CMakeLists.txt | 2 +- test/unittest/cmake/CMakeLists.txt | 4 +- test/unittest/common/GTestPrinters.hpp | 43 - .../dds/core/entity/mock/MockEntity.hpp | 2 +- test/unittest/dds/core/policy/CMakeLists.txt | 4 +- test/unittest/dds/participant/CMakeLists.txt | 2 +- .../dds/participant/ParticipantTests.cpp | 151 +- .../profiles/test_xml_for_string_profile.xml | 2 +- .../dds/profiles/test_xml_profile.xml | 2 +- test/unittest/dds/publisher/CMakeLists.txt | 4 +- .../dds/publisher/DataWriterTests.cpp | 7 +- .../unittest/dds/publisher/PublisherTests.cpp | 49 - test/unittest/dds/status/ListenerTests.cpp | 18 +- test/unittest/dds/subscriber/CMakeLists.txt | 4 +- .../dds/subscriber/DataReaderTests.cpp | 12 +- .../dds/subscriber/SubscriberTests.cpp | 81 +- test/unittest/dds/topic/CMakeLists.txt | 2 +- test/unittest/dds/topic/TopicTests.cpp | 13 +- test/unittest/dynamic_types/types_profile.xml | 2 +- test/unittest/rtps/DataSharing/CMakeLists.txt | 2 +- .../rtps/DataSharing/SHMSegmentTests.cpp | 11 +- .../builtin/BuiltinDataSerializationTests.cpp | 8 +- .../unittest/rtps/common/CacheChangeTests.cpp | 13 +- .../rtps/common/PortParametersTests.cpp | 9 +- .../rtps/common/SequenceNumberTests.cpp | 11 +- test/unittest/rtps/common/TimeTests.cpp | 4 +- test/unittest/rtps/discovery/CMakeLists.txt | 2 +- test/unittest/rtps/discovery/EdpTests.cpp | 149 +- test/unittest/rtps/discovery/PDPTests.cpp | 20 +- .../rtps/history/ReaderHistoryTests.cpp | 4 +- test/unittest/rtps/network/CMakeLists.txt | 1 - .../rtps/network/NetworkFactoryTests.cpp | 20 +- .../rtps/network/mock/MockTransport.cpp | 4 +- .../rtps/network/mock/MockTransport.h | 19 +- .../rtps/reader/WriterProxyAcknackTests.cpp | 14 +- .../rtps/reader/WriterProxyStopTest.cpp | 14 +- .../unittest/rtps/reader/WriterProxyTests.cpp | 11 +- .../resources/timedevent/TimedEventTests.cpp | 9 +- .../resources/timedevent/mock/MockEvent.h | 7 +- test/unittest/rtps/security/SecurityTests.hpp | 27 +- test/unittest/rtps/writer/CMakeLists.txt | 2 +- .../rtps/writer/LivelinessManagerTests.cpp | 144 +- .../unittest/rtps/writer/ReaderProxyTests.cpp | 15 +- .../accesscontrol/AccessControlTests.cpp | 23 +- .../AuthenticationPluginTests.hpp | 13 +- .../authentication/BuiltinPKIDHTests.cpp | 15 +- .../cryptography/CryptographyPluginTests.hpp | 19 +- test/unittest/statistics/dds/CMakeLists.txt | 10 +- .../mock/fastdds/publisher/DataWriterImpl.hpp | 24 +- .../statistics/dds/StatisticsQosTests.cpp | 4 +- test/unittest/statistics/rtps/CMakeLists.txt | 4 +- .../statistics/rtps/MonitorServiceTests.cpp | 2 +- .../statistics/rtps/RTPSStatisticsTests.cpp | 11 +- .../statistics/rtps/StatisticsBase.hpp | 4 +- .../rtps/monitor-service/MonitorService.hpp | 3 +- test/unittest/transport/CMakeLists.txt | 2 - test/unittest/transport/SharedMemTests.cpp | 44 +- test/unittest/transport/TCPv4Tests.cpp | 150 +- test/unittest/transport/TCPv6Tests.cpp | 46 +- test/unittest/transport/UDPv4Tests.cpp | 28 +- test/unittest/transport/UDPv6Tests.cpp | 28 +- .../transport/mock/MockReceiverResource.cpp | 35 +- .../transport/mock/MockReceiverResource.h | 4 +- .../transport/mock/MockTCPv4Transport.h | 5 +- .../transport/mock/MockTCPv6Transport.h | 4 +- test/unittest/utils/LocatorTests.cpp | 13 +- ...M_transport_descriptors_config_profile.xml | 2 +- ...P_transport_descriptors_config_profile.xml | 2 +- .../xmlparser/XMLEndpointParserTests.cpp | 23 +- test/unittest/xmlparser/XMLParserTests.cpp | 160 +- .../xmlparser/XMLProfileParserTests.cpp | 117 +- .../xmlparser/log_def_file_profile.xml | 2 +- .../xmlparser/log_inactive_profile.xml | 2 +- .../log_node_file_append_profile.xml | 2 +- .../xmlparser/log_stdouterr_profile.xml | 2 +- .../log_stdouterr_two_thresholds_profile.xml | 2 +- ...rr_wrong_property_name_profile_invalid.xml | 2 +- ...r_wrong_property_value_profile_invalid.xml | 2 +- .../simple_participant_profiles_nok.xml | 2 +- .../simple_participant_profiles_ok.xml | 2 +- .../xmlparser/test_xml_deprecated.xml | 2 +- .../xmlparser/test_xml_duration_profile.xml | 2 +- test/unittest/xmlparser/test_xml_profile.xml | 2 +- .../xmlparser/test_xml_profile_env_var.xml | 2 +- ...test_xml_root_library_settings_profile.xml | 2 +- .../xmlparser/test_xml_rooted_deprecated.xml | 2 +- .../xmlparser/test_xml_rooted_profile.xml | 2 +- .../xmlparser/test_xml_security_profile.xml | 2 +- .../unittest/xmlparser/tls_config_profile.xml | 2 +- test/unittest/xtypes/XTypesTests.cpp | 84 +- test/xtypes/CMakeLists.txt | 2 +- test/xtypes/TestPublisher.cpp | 14 +- test/xtypes/TestPublisher.h | 26 +- test/xtypes/TestSubscriber.cpp | 33 +- test/xtypes/TestSubscriber.h | 33 +- test/xtypes/XTypesTests.cpp | 33 +- thirdparty/boost/include/boostconfig.hpp | 2 +- tools/CMakeLists.txt | 2 +- tools/fastdds/fastdds.py | 2 +- tools/fastdds/shm/clean.py | 6 +- tools/fastdds/shm/parser.py | 2 +- tools/fastdds/xml_ci/parser.py | 2 +- tools/fds/CMakeLists.txt | 16 +- tools/fds/server.cpp | 4 +- utils/doxygen/complete_doxyfile_api | 2355 ----------------- doxyfile.in => utils/doxygen/doxyfile.in | 8 +- utils/doxygen/examples/fastrtps_example.cpp | 292 -- utils/doxygen/pages/eProsimaLogo.png | Bin 7443 -> 0 bytes utils/doxygen/pages/general_architecture.png | Bin 116972 -> 0 bytes .../pages/general_architecture_old.png | Bin 39393 -> 0 bytes utils/doxygen/pages/logoEprosimaBlueRTI.gif | Bin 2170 -> 0 bytes utils/doxygen/pages/mainpage.dox | 60 - utils/futureCode/ReceivedChanges.cpp | 83 - utils/futureCode/ReceivedChanges.h | 48 - utils/futureCode/SkipList.cpp | 172 -- utils/futureCode/SkipList.h | 67 - utils/images/icon/eprosima_icon.bmp | Bin 9742 -> 0 bytes utils/images/icon/eprosima_icon.ico | Bin 99678 -> 0 bytes utils/pcTests/Readme.md | 3 - versions.md | 6 +- 815 files changed, 3683 insertions(+), 40125 deletions(-) delete mode 100644 .settings/org.eclipse.cdt.codan.core.prefs delete mode 100644 CTestJenkins.cmake delete mode 100644 doc/README.html.in delete mode 100644 doc/design/intra-process.md delete mode 100644 doc/design/shared-memory-transport/interprocess_shared_mem.md delete mode 100644 doc/design/shared-memory-transport/interprocess_shared_mem1.png delete mode 100644 doc/design/shared-memory-transport/interprocess_shared_mem2.plantuml delete mode 100644 doc/design/shared-memory-transport/interprocess_shared_mem2.png delete mode 100644 doc/pdf/FASTRTPSGEN - User Manual.odt delete mode 100644 doc/pdf/Fast RTPS - Installation Manual.odt delete mode 100644 doc/pdf/Fast RTPS - Latency Test.odt delete mode 100644 doc/pdf/Fast RTPS - Throughput Test.odt delete mode 100644 doc/pdf/Fast RTPS - User Manual.odt delete mode 100755 doc/proposals/shared-memory-transport/sony/PubSub_overview.png delete mode 100755 doc/proposals/shared-memory-transport/sony/RPC_overview.png delete mode 100755 doc/proposals/shared-memory-transport/sony/improvement.png delete mode 100755 doc/proposals/shared-memory-transport/sony/ms1_rtps_shared_memory_transport.md delete mode 100755 doc/proposals/shared-memory-transport/sony/ms2_rmw_shared_memory_data_share_sony.md delete mode 100755 doc/proposals/shared-memory-transport/sony/rmw_sony_cpp.png delete mode 100644 examples/cpp/dds/DeadlineQoSExample/mapableKey.h rename fastrtps.repos => fastdds.repos (97%) delete mode 100644 include/dds/core/BuiltinTopicTypes.hpp delete mode 100644 include/dds/core/Duration.hpp delete mode 100644 include/dds/core/Entity.hpp delete mode 100644 include/dds/core/EntityQos.hpp delete mode 100644 include/dds/core/Exception.hpp delete mode 100644 include/dds/core/InstanceHandle.hpp delete mode 100644 include/dds/core/LengthUnlimited.hpp delete mode 100644 include/dds/core/Optional.hpp delete mode 100644 include/dds/core/QosProvider.hpp delete mode 100644 include/dds/core/Reference.hpp delete mode 100644 include/dds/core/SafeEnumeration.hpp delete mode 100644 include/dds/core/Time.hpp delete mode 100644 include/dds/core/Value.hpp delete mode 100644 include/dds/core/WeakReference.hpp delete mode 100644 include/dds/core/array.hpp delete mode 100644 include/dds/core/cond/Condition.hpp delete mode 100644 include/dds/core/cond/GuardCondition.hpp delete mode 100644 include/dds/core/cond/StatusCondition.hpp delete mode 100644 include/dds/core/cond/WaitSet.hpp delete mode 100644 include/dds/core/cond/detail/Condition.hpp delete mode 100644 include/dds/core/cond/detail/ConditionImpl.hpp delete mode 100644 include/dds/core/cond/detail/GuardCondition.hpp delete mode 100644 include/dds/core/cond/detail/GuardConditionImpl.hpp delete mode 100644 include/dds/core/cond/detail/StatusCondition.hpp delete mode 100644 include/dds/core/cond/detail/StatusConditionImpl.hpp delete mode 100644 include/dds/core/cond/detail/WaitSet.hpp delete mode 100644 include/dds/core/cond/detail/WaitSetImpl.hpp delete mode 100644 include/dds/core/conformance.hpp delete mode 100644 include/dds/core/ddscore.hpp delete mode 100644 include/dds/core/detail/BuiltinTopicTypes.hpp delete mode 100644 include/dds/core/detail/Entity.hpp delete mode 100644 include/dds/core/detail/EntityQosImpl.hpp delete mode 100644 include/dds/core/detail/InstanceHandle.hpp delete mode 100644 include/dds/core/detail/QosProvider.hpp delete mode 100644 include/dds/core/detail/QosProviderImpl.hpp delete mode 100644 include/dds/core/detail/ReferenceImpl.hpp delete mode 100644 include/dds/core/detail/Value.hpp delete mode 100644 include/dds/core/detail/WeakReferenceImpl.hpp delete mode 100644 include/dds/core/detail/array.hpp delete mode 100644 include/dds/core/detail/conformance.hpp delete mode 100644 include/dds/core/detail/dds_builtinTopics.h delete mode 100644 include/dds/core/detail/dds_builtinTopicsSplDcps.h delete mode 100644 include/dds/core/detail/dds_builtinTopics_DCPS.hpp delete mode 100644 include/dds/core/detail/dds_dcps_builtintopics.h delete mode 100644 include/dds/core/detail/dds_dcps_builtintopicsSplDcps.h delete mode 100644 include/dds/core/detail/dds_dcps_builtintopics_DCPS.hpp delete mode 100644 include/dds/core/detail/ddscore.hpp delete mode 100644 include/dds/core/detail/inttypes.hpp delete mode 100644 include/dds/core/detail/macros.hpp delete mode 100644 include/dds/core/detail/module_docs.hpp delete mode 100644 include/dds/core/detail/old_win_stdint.h delete mode 100644 include/dds/core/detail/ref_traits.hpp delete mode 100644 include/dds/core/macros.hpp delete mode 100644 include/dds/core/policy/CorePolicy.hpp delete mode 100644 include/dds/core/policy/PolicyKind.hpp delete mode 100644 include/dds/core/policy/QosPolicyCount.hpp delete mode 100644 include/dds/core/policy/detail/CorePolicy.hpp delete mode 100644 include/dds/core/policy/detail/CorePolicyImpl.hpp delete mode 100644 include/dds/core/policy/detail/QosPolicyCount.hpp delete mode 100644 include/dds/core/ref_traits.hpp delete mode 100644 include/dds/core/refmacros.hpp delete mode 100644 include/dds/core/status/State.hpp delete mode 100644 include/dds/core/status/Status.hpp delete mode 100644 include/dds/core/status/detail/Status.hpp delete mode 100644 include/dds/core/status/detail/StatusImpl.hpp delete mode 100644 include/dds/core/types.hpp delete mode 100644 include/dds/core/xtypes/Annotation.hpp delete mode 100644 include/dds/core/xtypes/AnnotationKind.hpp delete mode 100644 include/dds/core/xtypes/CollectionTypes.hpp delete mode 100644 include/dds/core/xtypes/DynamicData.hpp delete mode 100644 include/dds/core/xtypes/DynamicType.hpp delete mode 100644 include/dds/core/xtypes/MemberType.hpp delete mode 100644 include/dds/core/xtypes/PrimitiveTypes.hpp delete mode 100644 include/dds/core/xtypes/StructType.hpp delete mode 100644 include/dds/core/xtypes/TypeKind.hpp delete mode 100644 include/dds/core/xtypes/TypeProvider.hpp delete mode 100644 include/dds/core/xtypes/UnionCase.hpp delete mode 100644 include/dds/core/xtypes/UnionType.hpp delete mode 100644 include/dds/core/xtypes/detail/Annotation.hpp delete mode 100644 include/dds/core/xtypes/detail/CollectionTypes.hpp delete mode 100644 include/dds/core/xtypes/detail/DynamicData.hpp delete mode 100644 include/dds/core/xtypes/detail/DynamicType.hpp delete mode 100644 include/dds/core/xtypes/detail/MemberType.hpp delete mode 100644 include/dds/core/xtypes/detail/PrimitiveTypes.hpp delete mode 100644 include/dds/core/xtypes/detail/StructType.hpp delete mode 100644 include/dds/core/xtypes/detail/TypeProvider.hpp delete mode 100644 include/dds/core/xtypes/detail/UnionCase.hpp delete mode 100644 include/dds/core/xtypes/detail/UnionType.hpp delete mode 100644 include/dds/domain/DomainParticipant.hpp delete mode 100644 include/dds/domain/DomainParticipantListener.hpp delete mode 100644 include/dds/domain/detail/DomainParticipant.hpp delete mode 100644 include/dds/domain/qos/DomainParticipantQos.hpp delete mode 100644 include/dds/domain/qos/detail/DomainParticipantQos.hpp delete mode 100644 include/dds/pub/AnyDataWriter.hpp delete mode 100644 include/dds/pub/DataWriter.hpp delete mode 100644 include/dds/pub/Publisher.hpp delete mode 100644 include/dds/pub/PublisherListener.hpp delete mode 100644 include/dds/pub/detail/AnyDataWriter.hpp delete mode 100644 include/dds/pub/detail/DataWriter.hpp delete mode 100644 include/dds/pub/detail/Publisher.hpp delete mode 100644 include/dds/pub/qos/DataWriterQos.hpp delete mode 100644 include/dds/pub/qos/PublisherQos.hpp delete mode 100644 include/dds/pub/qos/detail/DataWriterQos.hpp delete mode 100644 include/dds/pub/qos/detail/PublisherQos.hpp delete mode 100644 include/dds/sub/DataReader.hpp delete mode 100644 include/dds/sub/DataReaderListener.hpp delete mode 100644 include/dds/sub/Subscriber.hpp delete mode 100644 include/dds/sub/SubscriberListener.hpp delete mode 100644 include/dds/sub/detail/DataReader.hpp delete mode 100644 include/dds/sub/detail/Subscriber.hpp delete mode 100644 include/dds/sub/qos/DataReaderQos.hpp delete mode 100644 include/dds/sub/qos/SubscriberQos.hpp delete mode 100644 include/dds/sub/qos/detail/DataReaderQos.hpp delete mode 100644 include/dds/sub/qos/detail/SubscriberQos.hpp delete mode 100644 include/dds/topic/Topic.hpp delete mode 100644 include/dds/topic/TopicListener.hpp delete mode 100644 include/dds/topic/detail/Topic.hpp delete mode 100644 include/dds/topic/qos/TopicQos.hpp delete mode 100644 include/dds/topic/qos/detail/TopicQos.hpp rename include/{fastrtps => fastdds}/config.h.in (78%) delete mode 100644 include/fastdds/rtps/writer/IReaderDataFilter.hpp delete mode 100644 include/fastrtps/utils/System.h delete mode 100644 include/fastrtps/utils/collections/foonathan_memory_helpers.hpp delete mode 100644 m4/ax_check_openssl.m4 delete mode 100644 m4/ax_cxx_compile_stdcxx_0x.m4 delete mode 100644 m4/ax_cxx_compile_stdcxx_11.m4 rename {doc => resources}/images/fastdds_github_banner.png (100%) rename {utils => resources}/images/logo/eProsimaLogo.jpg (100%) rename {utils => resources}/images/logo/eProsimaLogo.png (100%) rename resources/xsd/{fastRTPS_profiles.xsd => fastdds_profiles.xsd} (99%) delete mode 100644 src/cpp/dds/core/Exception.cpp delete mode 100644 src/cpp/dds/core/types.cpp delete mode 100644 src/cpp/dds/domain/DomainParticipant.cpp delete mode 100644 src/cpp/dds/pub/AnyDataWriter.cpp delete mode 100644 src/cpp/dds/pub/DataWriter.cpp delete mode 100644 src/cpp/dds/pub/Publisher.cpp delete mode 100644 src/cpp/dds/sub/DataReader.cpp delete mode 100644 src/cpp/dds/sub/Subscriber.cpp delete mode 100644 src/cpp/dds/topic/Topic.cpp delete mode 100644 src/cpp/fastdds/builtin/common/RPCHeadersImpl.cpp delete mode 100644 src/cpp/fastrtps_deprecated/Domain.cpp delete mode 100644 src/cpp/fastrtps_deprecated/participant/Participant.cpp delete mode 100644 src/cpp/fastrtps_deprecated/participant/ParticipantImpl.cpp delete mode 100644 src/cpp/fastrtps_deprecated/participant/ParticipantImpl.h delete mode 100644 src/cpp/fastrtps_deprecated/publisher/Publisher.cpp delete mode 100644 src/cpp/fastrtps_deprecated/publisher/PublisherHistory.cpp delete mode 100644 src/cpp/fastrtps_deprecated/publisher/PublisherImpl.cpp delete mode 100644 src/cpp/fastrtps_deprecated/publisher/PublisherImpl.h delete mode 100644 src/cpp/fastrtps_deprecated/subscriber/Subscriber.cpp delete mode 100644 src/cpp/fastrtps_deprecated/subscriber/SubscriberHistory.cpp delete mode 100644 src/cpp/fastrtps_deprecated/subscriber/SubscriberImpl.cpp delete mode 100644 src/cpp/fastrtps_deprecated/subscriber/SubscriberImpl.h create mode 100644 src/cpp/libfastdds.version delete mode 100644 src/cpp/libfastrtps.version rename src/cpp/{fastrtps_deprecated => rtps}/attributes/TopicAttributes.cpp (100%) delete mode 100644 src/cpp/utils/System.cpp rename test/mock/rtps/TCPTransportDescriptor/{fastrtps => fastdds/rtps}/transport/TCPTransportDescriptor.h (96%) create mode 100644 test/mock/rtps/TCPv4TransportDescriptor/fastdds/rtps/transport/TCPv4TransportDescriptor.h delete mode 100644 test/mock/rtps/TCPv4TransportDescriptor/fastrtps/transport/TCPv4TransportDescriptor.h rename test/mock/rtps/TCPv6TransportDescriptor/{fastrtps => fastdds/rtps}/transport/TCPv6TransportDescriptor.h (67%) rename test/mock/rtps/UDPTransportDescriptor/{fastrtps => fastdds/rtps}/transport/UDPTransportDescriptor.h (56%) rename test/mock/rtps/UDPv4TransportDescriptor/{fastrtps => fastdds/rtps}/transport/UDPv4TransportDescriptor.h (63%) rename test/mock/rtps/UDPv6TransportDescriptor/{fastrtps => fastdds/rtps}/transport/UDPv6TransportDescriptor.h (62%) delete mode 100644 test/unittest/common/GTestPrinters.hpp delete mode 100644 utils/doxygen/complete_doxyfile_api rename doxyfile.in => utils/doxygen/doxyfile.in (99%) delete mode 100644 utils/doxygen/examples/fastrtps_example.cpp delete mode 100644 utils/doxygen/pages/eProsimaLogo.png delete mode 100644 utils/doxygen/pages/general_architecture.png delete mode 100644 utils/doxygen/pages/general_architecture_old.png delete mode 100644 utils/doxygen/pages/logoEprosimaBlueRTI.gif delete mode 100644 utils/doxygen/pages/mainpage.dox delete mode 100644 utils/futureCode/ReceivedChanges.cpp delete mode 100644 utils/futureCode/ReceivedChanges.h delete mode 100644 utils/futureCode/SkipList.cpp delete mode 100644 utils/futureCode/SkipList.h delete mode 100644 utils/images/icon/eprosima_icon.bmp delete mode 100644 utils/images/icon/eprosima_icon.ico delete mode 100644 utils/pcTests/Readme.md diff --git a/.github/workflows/config/asan_colcon.meta b/.github/workflows/config/asan_colcon.meta index b35d778421d..58bb8ed124b 100644 --- a/.github/workflows/config/asan_colcon.meta +++ b/.github/workflows/config/asan_colcon.meta @@ -1,5 +1,5 @@ names: - fastrtps: + fastdds: cmake-args: - "-DNO_TLS=OFF" - "-DSECURITY=ON" @@ -14,4 +14,3 @@ names: - "-Dgtest_force_shared_crt=ON" - "-DBUILD_SHARED_LIBS=ON" - "-DBUILD_GMOCK=ON" - diff --git a/.github/workflows/config/ci.meta b/.github/workflows/config/ci.meta index 471c510dac4..13abcf5975d 100644 --- a/.github/workflows/config/ci.meta +++ b/.github/workflows/config/ci.meta @@ -1,5 +1,5 @@ names: - fastrtps: + fastdds: cmake-args: - "-DBUILD_DOCUMENTATION=OFF" - "-DBUILD_SHARED_LIBS=ON" @@ -19,7 +19,7 @@ names: - "-DSTRICT_REALTIME=OFF" - "-DSYSTEM_TESTS=ON" - "-DMEMORYCHECK_COMMAND_OPTIONS=-q --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=50 --log-fd=2 --error-exitcode=1" - - "-DMEMORYCHECK_SUPPRESSIONS_FILE=../../src/fastrtps/valgrind.supp" + - "-DMEMORYCHECK_SUPPRESSIONS_FILE=../../src/fastdds/valgrind.supp" googletest-distribution: cmake-args: - "-Dgtest_force_shared_crt=ON" diff --git a/.github/workflows/config/documentation.meta b/.github/workflows/config/documentation.meta index c0d85a3d55f..f6a3e624c81 100644 --- a/.github/workflows/config/documentation.meta +++ b/.github/workflows/config/documentation.meta @@ -1,5 +1,5 @@ names: - fastrtps: + fastdds: cmake-args: - "-DBUILD_SHARED_LIBS=ON" - "-DSECURITY=ON" diff --git a/.github/workflows/config/tsan_colcon.meta b/.github/workflows/config/tsan_colcon.meta index 341a32d0c23..e406dfc183a 100644 --- a/.github/workflows/config/tsan_colcon.meta +++ b/.github/workflows/config/tsan_colcon.meta @@ -3,12 +3,11 @@ names: cmake-args: - "-DCMAKE_C_FLAGS='-fsanitize=thread -O2 -g -fno-omit-frame-pointer'" - "-DCMAKE_CXX_FLAGS='-fsanitize=thread -O2 -g -fno-omit-frame-pointer'" - fastrtps: + fastdds: cmake-args: - "-DCOMPILE_EXAMPLES=OFF" - "-DEPROSIMA_BUILD_TESTS=ON" - "-DRTPS_API_TESTS=ON" - - "-DFASTRTPS_API_TESTS=OFF" - "-DFASTDDS_PIM_API_TESTS=ON" - "-DPERFORMANCE_TESTS=ON" - "-DNO_TLS=OFF" diff --git a/.github/workflows/documentation-tests.yaml b/.github/workflows/documentation-tests.yaml index 6cf88b01536..4c103c83459 100644 --- a/.github/workflows/documentation-tests.yaml +++ b/.github/workflows/documentation-tests.yaml @@ -44,7 +44,7 @@ jobs: - name: Sync eProsima/Fast-DDS repository uses: eProsima/eProsima-CI/external/checkout@v0 with: - path: src/fastrtps + path: src/fastdds submodules: true - name: Get minimum supported version of CMake @@ -74,14 +74,14 @@ jobs: - name: Download Fast DDS .repos uses: eProsima/eProsima-CI/ubuntu/vcs_import@v0 with: - vcs_repos_file: ./src/fastrtps/fastrtps.repos + vcs_repos_file: ./src/fastdds/fastdds.repos destination_workspace: src skip_existing: 'true' - name: Fetch Fast DDS CI dependencies uses: eProsima/eProsima-CI/multiplatform/vcs_import@v0 with: - vcs_repos_file: ${{ github.workspace }}/src/fastrtps/.github/workflows/config/ci.repos + vcs_repos_file: ${{ github.workspace }}/src/fastdds/.github/workflows/config/ci.repos destination_workspace: src skip_existing: 'true' @@ -123,7 +123,7 @@ jobs: continue-on-error: false uses: eProsima/eProsima-CI/multiplatform/colcon_build@v0 with: - colcon_meta_file: './src/fastrtps/.github/workflows/config/documentation.meta' + colcon_meta_file: './src/fastdds/.github/workflows/config/documentation.meta' colcon_build_args: '' colcon_build_args_default: '' cmake_args: '' diff --git a/.github/workflows/mac-ci.yml b/.github/workflows/mac-ci.yml index 69f34c3f044..41fc2321963 100644 --- a/.github/workflows/mac-ci.yml +++ b/.github/workflows/mac-ci.yml @@ -1,4 +1,4 @@ -name: Fast-DDS MacOS CI +name: Fast DDS MacOS CI on: workflow_dispatch: @@ -48,4 +48,4 @@ jobs: colcon-args: ${{ inputs.colcon-args }} cmake-args: '-DSECURITY=ON ${{ inputs.cmake-args }}' ctest-args: ${{ inputs.ctest-args }} - fastdds-branch: ${{ inputs.fastdds_branch || github.ref || 'master' }} + fastdds-branch: ${{ inputs.fastdds_branch || github.ref || '3.0.x-devel' }} diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 8490d894475..95d158caf36 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -11,7 +11,7 @@ jobs: fail-fast: false matrix: dest_branch: - - '2.14.x' + - '3.0.x' steps: - name: Mirror action step id: mirror diff --git a/.github/workflows/nightly-mac-ci.yml b/.github/workflows/nightly-mac-ci.yml index 157e23d5e3b..e4b1ce0e4f7 100644 --- a/.github/workflows/nightly-mac-ci.yml +++ b/.github/workflows/nightly-mac-ci.yml @@ -1,4 +1,4 @@ -name: Fast-DDS MacOS CI (nightly) +name: Fast DDS MacOS CI (nightly) on: workflow_dispatch: diff --git a/.github/workflows/nightly-ubuntu-ci.yml b/.github/workflows/nightly-ubuntu-ci.yml index 79df7e5a61c..751a385c73f 100644 --- a/.github/workflows/nightly-ubuntu-ci.yml +++ b/.github/workflows/nightly-ubuntu-ci.yml @@ -1,4 +1,4 @@ -name: Fast-DDS Ubuntu CI (nightly) +name: Fast DDS Ubuntu CI (nightly) on: workflow_dispatch: diff --git a/.github/workflows/nightly-windows-ci.yml b/.github/workflows/nightly-windows-ci.yml index 29c50cb09e7..01a67c6e670 100644 --- a/.github/workflows/nightly-windows-ci.yml +++ b/.github/workflows/nightly-windows-ci.yml @@ -1,4 +1,4 @@ -name: Fast-DDS Windows CI (nightly) +name: Fast DDS Windows CI (nightly) on: workflow_dispatch: diff --git a/.github/workflows/reusable-mac-ci.yml b/.github/workflows/reusable-mac-ci.yml index 3807960499e..02ee5916ad7 100644 --- a/.github/workflows/reusable-mac-ci.yml +++ b/.github/workflows/reusable-mac-ci.yml @@ -1,4 +1,4 @@ -name: Fast-DDS MacOS CI reusable workflow +name: Fast DDS MacOS CI reusable workflow on: workflow_call: @@ -55,7 +55,7 @@ jobs: - name: Sync eProsima/Fast-DDS repository uses: eProsima/eProsima-CI/external/checkout@v0 with: - path: src/fastrtps + path: src/fastdds ref: ${{ inputs.fastdds-branch }} - uses: eProsima/eProsima-CI/external/setup-python@v0 @@ -93,14 +93,14 @@ jobs: - name: Fetch Fast DDS dependencies uses: eProsima/eProsima-CI/multiplatform/vcs_import@v0 with: - vcs_repos_file: ${{ github.workspace }}/src/fastrtps/fastrtps.repos + vcs_repos_file: ${{ github.workspace }}/src/fastdds/fastdds.repos destination_workspace: src skip_existing: 'true' - name: Fetch Fast DDS CI dependencies uses: eProsima/eProsima-CI/multiplatform/vcs_import@v0 with: - vcs_repos_file: ${{ github.workspace }}/src/fastrtps/.github/workflows/config/ci.repos + vcs_repos_file: ${{ github.workspace }}/src/fastdds/.github/workflows/config/ci.repos destination_workspace: src skip_existing: 'true' @@ -112,7 +112,7 @@ jobs: continue-on-error: false uses: eProsima/eProsima-CI/multiplatform/colcon_build@v0 with: - colcon_meta_file: ${{ github.workspace }}/src/fastrtps/.github/workflows/config/ci.meta + colcon_meta_file: ${{ github.workspace }}/src/fastdds/.github/workflows/config/ci.meta colcon_build_args: ${{ inputs.colcon-args }} cmake_args: ${{ inputs.cmake-args }} cmake_args_default: -DCMAKE_CXX_FLAGS="-Werror -Wall -Wno-enum-constexpr-conversion" @@ -128,7 +128,7 @@ jobs: colcon_test_args_default: --event-handlers=console_direct+ ctest_args: ${{ inputs.ctest-args }} ctest_args_default: --repeat until-pass:3 --timeout 300 --label-exclude "xfail" - packages_names: fastrtps + packages_names: fastdds workspace: ${{ github.workspace }} test_report_artifact: ${{ format('test_report_{0}_{1}_{2}', inputs.label, github.job, join(matrix.*, '_')) }} diff --git a/.github/workflows/reusable-sanitizers-ci.yml b/.github/workflows/reusable-sanitizers-ci.yml index a08587bf322..59112186a90 100644 --- a/.github/workflows/reusable-sanitizers-ci.yml +++ b/.github/workflows/reusable-sanitizers-ci.yml @@ -71,7 +71,7 @@ jobs: - name: Sync eProsima/Fast-DDS repository uses: eProsima/eProsima-CI/external/checkout@v0 with: - path: src/fastrtps + path: src/fastdds ref: ${{ inputs.fastdds_ref }} - name: Get minimum supported version of CMake @@ -98,27 +98,27 @@ jobs: - name: Fetch Fast DDS dependencies uses: eProsima/eProsima-CI/multiplatform/vcs_import@v0 with: - vcs_repos_file: ${{ github.workspace }}/src/fastrtps/fastrtps.repos + vcs_repos_file: ${{ github.workspace }}/src/fastdds/fastdds.repos destination_workspace: src skip_existing: 'true' - name: Fetch Fast DDS CI dependencies uses: eProsima/eProsima-CI/multiplatform/vcs_import@v0 with: - vcs_repos_file: ${{ github.workspace }}/src/fastrtps/.github/workflows/config/asan.repos + vcs_repos_file: ${{ github.workspace }}/src/fastdds/.github/workflows/config/asan.repos destination_workspace: src skip_existing: 'true' - name: Show .meta file id: show_meta run: | - cat ${{ github.workspace }}/src/fastrtps/.github/workflows/config/asan_colcon.meta + cat ${{ github.workspace }}/src/fastdds/.github/workflows/config/asan_colcon.meta - name: Colcon build continue-on-error: false uses: eProsima/eProsima-CI/multiplatform/colcon_build@v0 with: - colcon_meta_file: ${{ github.workspace }}/src/fastrtps/.github/workflows/config/asan_colcon.meta + colcon_meta_file: ${{ github.workspace }}/src/fastdds/.github/workflows/config/asan_colcon.meta colcon_build_args: ${{ inputs.colcon_build_args }} cmake_args: ${{ inputs.cmake_args }} cmake_args_default: '' @@ -166,16 +166,16 @@ jobs: - name: Show .meta file id: show_meta run: | - cat ${{ github.workspace }}/src/fastrtps/.github/workflows/config/asan_colcon.meta + cat ${{ github.workspace }}/src/fastdds/.github/workflows/config/asan_colcon.meta - name: Colcon build continue-on-error: false uses: eProsima/eProsima-CI/multiplatform/colcon_build@v0 with: - colcon_meta_file: ${{ github.workspace }}/src/fastrtps/.github/workflows/config/asan_colcon.meta + colcon_meta_file: ${{ github.workspace }}/src/fastdds/.github/workflows/config/asan_colcon.meta colcon_build_args: ${{ inputs.colcon_build_args }} cmake_args: ${{ inputs.cmake_args }} - cmake_args_default: -DEPROSIMA_BUILD_TESTS=ON -DRTPS_API_TESTS=ON -DFASTRTPS_API_TESTS=ON -DFASTDDS_PIM_API_TESTS=ON -DPERFORMANCE_TESTS=ON + cmake_args_default: -DEPROSIMA_BUILD_TESTS=ON -DRTPS_API_TESTS=ON -Dfastdds_API_TESTS=ON -DFASTDDS_PIM_API_TESTS=ON -DPERFORMANCE_TESTS=ON cmake_build_type: 'Debug' workspace: ${{ github.workspace }} workspace_dependencies: '' @@ -190,7 +190,7 @@ jobs: colcon_test_args_default: '--event-handlers=console_direct+ --return-code-on-test-failure' ctest_args: ${{ inputs.ctest_args }} ctest_args_default: '--timeout 300 --label-exclude "xfail"' - packages_names: fastrtps + packages_names: fastdds workspace: ${{ github.workspace }} workspace_dependencies: '' test_report_artifact: ${{ format('test_report_{0}_{1}', inputs.label, github.job) }} @@ -198,13 +198,13 @@ jobs: - name: Report sanitizer errors if: ${{ inputs.run_asan_fastdds }} run: | - bash src/fastrtps/.github/workflows/utils/specific_errors_filter.sh \ + bash src/fastdds/.github/workflows/utils/specific_errors_filter.sh \ "==ERROR:" \ - log/latest_test/fastrtps/stdout_stderr.log \ + log/latest_test/fastdds/stdout_stderr.log \ _tmp_specific_error_file.log - python3 src/fastrtps/.github/workflows/utils/log_parser.py \ - --log-file log/latest_test/fastrtps/stdout_stderr.log \ + python3 src/fastdds/.github/workflows/utils/log_parser.py \ + --log-file log/latest_test/fastdds/stdout_stderr.log \ --specific-error-file _tmp_specific_error_file.log \ --output-file $GITHUB_STEP_SUMMARY \ --sanitizer asan @@ -263,13 +263,13 @@ jobs: - name: Show .meta file id: show_meta run: | - cat ${{ github.workspace }}/src/fastrtps/.github/workflows/config/asan_colcon.meta + cat ${{ github.workspace }}/src/fastdds/.github/workflows/config/asan_colcon.meta - name: Colcon build continue-on-error: false uses: eProsima/eProsima-CI/multiplatform/colcon_build@v0 with: - colcon_meta_file: ${{ github.workspace }}/src/fastrtps/.github/workflows/config/asan_colcon.meta + colcon_meta_file: ${{ github.workspace }}/src/fastdds/.github/workflows/config/asan_colcon.meta colcon_build_args: ${{ inputs.colcon_build_args }} cmake_args: ${{ inputs.cmake_args }} cmake_args_default: '' @@ -295,12 +295,12 @@ jobs: - name: Report sanitizer errors if: ${{ inputs.run_asan_discovery_server }} run: | - bash src/fastrtps/.github/workflows/utils/specific_errors_filter.sh \ + bash src/fastdds/.github/workflows/utils/specific_errors_filter.sh \ "==ERROR:" \ log/latest_test/discovery-server/stdout_stderr.log \ _tmp_specific_error_file.log - python3 src/fastrtps/.github/workflows/utils/log_parser.py \ + python3 src/fastdds/.github/workflows/utils/log_parser.py \ --log-file log/latest_test/discovery-server/stdout_stderr.log \ --specific-error-file _tmp_specific_error_file.log \ --output-file $GITHUB_STEP_SUMMARY \ @@ -332,7 +332,7 @@ jobs: - name: Sync eProsima/Fast-DDS repository uses: eProsima/eProsima-CI/external/checkout@v0 with: - path: src/fastrtps + path: src/fastdds ref: ${{ inputs.fastdds_ref }} - name: Get minimum supported version of CMake @@ -359,27 +359,27 @@ jobs: - name: Fetch Fast DDS dependencies uses: eProsima/eProsima-CI/multiplatform/vcs_import@v0 with: - vcs_repos_file: ${{ github.workspace }}/src/fastrtps/fastrtps.repos + vcs_repos_file: ${{ github.workspace }}/src/fastdds/fastdds.repos destination_workspace: src skip_existing: 'true' - name: Fetch Fast DDS CI dependencies uses: eProsima/eProsima-CI/multiplatform/vcs_import@v0 with: - vcs_repos_file: ${{ github.workspace }}/src/fastrtps/.github/workflows/config/ci.repos + vcs_repos_file: ${{ github.workspace }}/src/fastdds/.github/workflows/config/ci.repos destination_workspace: src skip_existing: 'true' - name: Show .meta file id: show_meta run: | - cat ${{ github.workspace }}/src/fastrtps/.github/workflows/config/tsan_colcon.meta + cat ${{ github.workspace }}/src/fastdds/.github/workflows/config/tsan_colcon.meta - name: Colcon build continue-on-error: false uses: eProsima/eProsima-CI/multiplatform/colcon_build@v0 with: - colcon_meta_file: ${{ github.workspace }}/src/fastrtps/.github/workflows/config/tsan_colcon.meta + colcon_meta_file: ${{ github.workspace }}/src/fastdds/.github/workflows/config/tsan_colcon.meta colcon_build_args: ${{ inputs.colcon_build_args }} cmake_args: ${{ inputs.cmake_args }} cmake_args_default: '' @@ -397,7 +397,7 @@ jobs: colcon_test_args_default: '--event-handlers=console_direct+ --return-code-on-test-failure' ctest_args: ${{ inputs.ctest_args }} ctest_args_default: '--timeout 300 --label-exclude "xfail" -V -E DDSSQLFilterValueTests' - packages_names: fastrtps + packages_names: fastdds workspace: ${{ github.workspace }} workspace_dependencies: '' test_report_artifact: ${{ format('test_report_{0}_{1}', inputs.label, github.job) }} @@ -410,7 +410,7 @@ jobs: # Create a dir for the exports $exports = New-Item -ItemType Directory -Path ./exports # Move to the reports dir - pushd ./log/latest_test/fastrtps + pushd ./log/latest_test/fastdds # Install the report parser module Find-Module -Repository PSGallery -Name SanReportParser | Install-Module -Scope CurrentUser -Force # Parse the report files diff --git a/.github/workflows/reusable-ubuntu-ci.yml b/.github/workflows/reusable-ubuntu-ci.yml index 6c3b1d59ff9..f6b722fbfbe 100644 --- a/.github/workflows/reusable-ubuntu-ci.yml +++ b/.github/workflows/reusable-ubuntu-ci.yml @@ -1,4 +1,4 @@ -name: Fast-DDS Ubuntu CI reusable workflow +name: Fast DDS Ubuntu CI reusable workflow on: workflow_call: @@ -53,7 +53,7 @@ jobs: - name: Sync eProsima/Fast-DDS repository uses: eProsima/eProsima-CI/external/checkout@v0 with: - path: src/fastrtps + path: src/fastdds ref: ${{ inputs.fastdds-branch }} - name: Install Fix Python version @@ -92,14 +92,14 @@ jobs: - name: Fetch Fast DDS dependencies uses: eProsima/eProsima-CI/multiplatform/vcs_import@v0 with: - vcs_repos_file: ${{ github.workspace }}/src/fastrtps/fastrtps.repos + vcs_repos_file: ${{ github.workspace }}/src/fastdds/fastdds.repos destination_workspace: src skip_existing: 'true' - name: Fetch Fast DDS CI dependencies uses: eProsima/eProsima-CI/multiplatform/vcs_import@v0 with: - vcs_repos_file: ${{ github.workspace }}/src/fastrtps/.github/workflows/config/ci.repos + vcs_repos_file: ${{ github.workspace }}/src/fastdds/.github/workflows/config/ci.repos destination_workspace: src skip_existing: 'true' @@ -109,7 +109,7 @@ jobs: uses: eProsima/eProsima-CI/ubuntu/get_related_branch_from_repo@v0 with: remote_repository: eProsima/ShapesDemo - fallback_branch: ${{ inputs.fastdds-branch || 'master' }} + fallback_branch: ${{ inputs.fastdds-branch || '3.0.x-devel' }} - name: Download Shapes Demo repo uses: eProsima/eProsima-CI/external/checkout@v0 @@ -133,7 +133,7 @@ jobs: continue-on-error: false uses: eProsima/eProsima-CI/multiplatform/colcon_build@v0 with: - colcon_meta_file: ${{ github.workspace }}/src/fastrtps/.github/workflows/config/ci.meta + colcon_meta_file: ${{ github.workspace }}/src/fastdds/.github/workflows/config/ci.meta colcon_build_args: ${{ inputs.colcon-args }} cmake_args: ${{ inputs.cmake-args }} cmake_args_default: -DCMAKE_CXX_FLAGS="-Werror -Wall -Wextra -Wpedantic -Wunused-value -Woverloaded-virtual" -DFASTDDS_EXAMPLE_TESTS=ON @@ -149,7 +149,7 @@ jobs: colcon_test_args_default: --event-handlers=console_direct+ ctest_args: ${{ inputs.ctest-args }} ctest_args_default: --repeat until-pass:3 --timeout 300 --label-exclude "xfail" - packages_names: fastrtps + packages_names: fastdds workspace: ${{ github.workspace }} test_report_artifact: ${{ format('test_report_{0}_{1}_{2}', inputs.label, github.job, join(matrix.*, '_')) }} diff --git a/.github/workflows/reusable-windows-ci.yml b/.github/workflows/reusable-windows-ci.yml index 3524ed8b9f0..41d7952c835 100644 --- a/.github/workflows/reusable-windows-ci.yml +++ b/.github/workflows/reusable-windows-ci.yml @@ -1,4 +1,4 @@ -name: Fast-DDS Windows CI reusable workflow +name: Fast DDS Windows CI reusable workflow on: workflow_call: @@ -52,7 +52,7 @@ jobs: - name: Sync eProsima/Fast-DDS repository uses: eProsima/eProsima-CI/external/checkout@v0 with: - path: src/fastrtps + path: src/fastdds submodules: true ref: ${{ inputs.fastdds_branch }} @@ -131,14 +131,14 @@ jobs: - name: Fetch Fast DDS dependencies uses: eProsima/eProsima-CI/multiplatform/vcs_import@v0 with: - vcs_repos_file: ${{ github.workspace }}\src\fastrtps\fastrtps.repos + vcs_repos_file: ${{ github.workspace }}\src\fastdds\fastdds.repos destination_workspace: src skip_existing: 'true' - name: Fetch Fast DDS CI dependencies uses: eProsima/eProsima-CI/multiplatform/vcs_import@v0 with: - vcs_repos_file: ${{ github.workspace }}\src\fastrtps\.github\workflows\config\ci.repos + vcs_repos_file: ${{ github.workspace }}\src\fastdds\.github\workflows\config\ci.repos destination_workspace: src skip_existing: 'true' @@ -147,7 +147,7 @@ jobs: continue-on-error: false uses: eProsima/eProsima-CI/windows/colcon_build@v0 with: - colcon_meta_file: ${{ github.workspace }}\src\fastrtps\.github\workflows\config\ci.meta + colcon_meta_file: ${{ github.workspace }}\src\fastdds\.github\workflows\config\ci.meta colcon_build_args: ${{ inputs.colcon-args }} # The following Fast DDS CMake options need to be specified here instead of in the ci.meta file # because they vary from platform to platform @@ -164,7 +164,7 @@ jobs: colcon_test_args_default: --event-handlers=console_direct+ ctest_args: ${{ inputs.ctest-args }} ctest_args_default: --repeat until-pass:3 --timeout 300 --label-exclude "xfail" - packages_names: fastrtps + packages_names: fastdds workspace: ${{ github.workspace }} test_report_artifact: ${{ format('test_report_{0}_{1}_{2}', inputs.label, github.job, join(matrix.*, '_')) }} diff --git a/.github/workflows/ubuntu-ci.yml b/.github/workflows/ubuntu-ci.yml index 01861fccbc1..f8e0cf7be0b 100644 --- a/.github/workflows/ubuntu-ci.yml +++ b/.github/workflows/ubuntu-ci.yml @@ -1,4 +1,4 @@ -name: Fast-DDS Ubuntu CI +name: Fast DDS Ubuntu CI on: workflow_dispatch: @@ -56,4 +56,4 @@ jobs: colcon-args: ${{ inputs.colcon-args }} cmake-args: '-DSECURITY=ON ${{ inputs.cmake-args }}' ctest-args: ${{ inputs.ctest-args || '-LE xfail' }} - fastdds-branch: ${{ inputs.fastdds_branch || github.ref || 'master' }} + fastdds-branch: ${{ inputs.fastdds_branch || github.ref || '3.0.x-devel' }} diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index 0838b8fdde8..0a8b3c00e12 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -1,4 +1,4 @@ -name: Fast-DDS Windows CI +name: Fast DDS Windows CI on: workflow_dispatch: @@ -48,4 +48,4 @@ jobs: colcon-args: ${{ inputs.colcon-args }} cmake-args: '-DSECURITY=ON ${{ inputs.cmake-args }}' ctest-args: ${{ inputs.ctest-args }} - fastdds_branch: ${{ inputs.fastdds_branch || github.ref || 'master' }} + fastdds_branch: ${{ inputs.fastdds_branch || github.ref || '3.0.x-devel' }} diff --git a/.settings/org.eclipse.cdt.codan.core.prefs b/.settings/org.eclipse.cdt.codan.core.prefs deleted file mode 100644 index 77386c23cbe..00000000000 --- a/.settings/org.eclipse.cdt.codan.core.prefs +++ /dev/null @@ -1,67 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.cdt.codan.checkers.errnoreturn=Warning -org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false} -org.eclipse.cdt.codan.checkers.errreturnvalue=Error -org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.checkers.noreturn=Error -org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false} -org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error -org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error -org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning -org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error -org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning -org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false} -org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning -org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},unknown\=>false,exceptions\=>()} -org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error -org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning -org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},skip\=>true} -org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error -org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error -org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error -org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error -org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error -org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error -org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error -org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info -org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},pattern\=>"^[a-z]",macro\=>true,exceptions\=>()} -org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning -org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error -org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error -org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error -org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning -org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning -org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning -org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>()} -org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning -org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},paramNot\=>false} -org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning -org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},else\=>false,afterelse\=>false} -org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error -org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} -org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning -org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true} -org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning -org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true} -org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning -org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>("@(\#)","$Id")} -org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error -org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} diff --git a/CMakeLists.txt b/CMakeLists.txt index ca781828ea4..5871f3b0326 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,9 +29,9 @@ endif() ############################################################################### # Project # ############################################################################### -project(fastrtps VERSION "2.14.1" LANGUAGES C CXX) +project(fastdds VERSION "3.0.0" LANGUAGES C CXX) -set(PROJECT_NAME_LARGE "Fast RTPS") +set(PROJECT_NAME_LARGE "Fast DDS") string(TOUPPER "${PROJECT_NAME}" PROJECT_NAME_UPPER) message(STATUS "Version: ${PROJECT_VERSION}") @@ -229,12 +229,12 @@ option(BUILD_SHARED_LIBS "Create shared libraries by default" ON) ############################################################################### include(${PROJECT_SOURCE_DIR}/cmake/common/eprosima_libraries.cmake) -# if we are building Fast-DDS as a static library we must load Fast-CDR as one +# if we are building Fast DDS as a static library we must load Fast-CDR as one if(NOT BUILD_SHARED_LIBS) set(FASTDDS_STATIC ON) endif() -eprosima_find_package(fastcdr REQUIRED) +eprosima_find_package(fastcdr 2 REQUIRED) eprosima_find_thirdparty(Asio asio VERSION 1.10.8) eprosima_find_thirdparty(TinyXML2 tinyxml2) @@ -477,7 +477,7 @@ if(BUILD_DOCUMENTATION) set(USE_DOT YES) endif() # Configure the template doxyfile for or specific project - configure_file(doxyfile.in ${PROJECT_BINARY_DIR}/doxyfile @ONLY IMMEDIATE) + configure_file(utils/doxygen/doxyfile.in ${PROJECT_BINARY_DIR}/doxyfile @ONLY IMMEDIATE) # Add custom target to run doxygen when ever the project is build add_custom_target(doxygen COMMAND "${DOXYGEN_EXECUTABLE}" "${PROJECT_BINARY_DIR}/doxyfile" @@ -497,7 +497,6 @@ if(BUILD_DOCUMENTATION) set(README_INSTALL_LOCATION "${DOC_INSTALL_DIR}") endif() - configure_file(doc/README.html.in ${README_LOCATION}/README.html @ONLY IMMEDIATE) ### ReadTheDocs ######################## if(NOT CHECK_DOCUMENTATION) @@ -557,7 +556,7 @@ install(FILES ${PROJECT_SOURCE_DIR}/LICENSE ) # Install xml validators -install(FILES ${PROJECT_SOURCE_DIR}/resources/xsd/fastRTPS_profiles.xsd +install(FILES ${PROJECT_SOURCE_DIR}/resources/xsd/fastdds_profiles.xsd DESTINATION ${DATA_INSTALL_DIR} COMPONENT xsd ) @@ -597,11 +596,6 @@ if(BUILD_DOCUMENTATION) COMPONENT documentation ) - install(FILES "${README_LOCATION}/README.html" - DESTINATION ${README_INSTALL_LOCATION} - COMPONENT documentation - ) - if(NOT CHECK_DOCUMENTATION) install(DIRECTORY ${PROJECT_BINARY_DIR}/doc/manual DESTINATION ${DOC_INSTALL_DIR} diff --git a/CTestJenkins.cmake b/CTestJenkins.cmake deleted file mode 100644 index 1c5bbfb15c7..00000000000 --- a/CTestJenkins.cmake +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set(CTEST_SOURCE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") -set(CTEST_BINARY_DIRECTORY "${CTEST_SOURCE_DIRECTORY}/build") -set(CTEST_TEST_TIMEOUT 300) - -site_name(CTEST_SITE) -set(CTEST_BUILD_NAME "${JENKINS_BUILD_NAME}") -set(CTEST_BUILD_OPTIONS "${JENKINS_BUILD_OPTIONS}") -set(CTEST_BUILD_CONFIGURATION "${JENKINS_BUILD_CONFIGURATION}") - -set(CTEST_MEMORYCHECK_COMMAND_OPTIONS "${CTEST_MEMORYCHECK_COMMAND_OPTIONS} --quiet --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=50 --xml=yes --xml-file=test_%p_memcheck.xml \"--suppressions=${CTEST_SOURCE_DIRECTORY}/valgrind.supp\"") - -set(CTEST_COVERAGE_C_FLAGS "-DCMAKE_C_FLAGS:STRING=-fwrapv -fprofile-arcs -ftest-coverage") -set(CTEST_COVERAGE_CXX_FLAGS "-DCMAKE_CXX_FLAGS:STRING=-fwrapv -fprofile-arcs -ftest-coverage") -set(CTEST_COVERAGE_EXE_LD_FLAGS "-DCMAKE_EXE_LINKER_FLAGS:STRING=-fprofile-arcs -ftest-coverage") -set(CTEST_COVERAGE_SHARED_LD_FLAGS "-DCMAKE_SHARED_LINKER_FLAGS:STRING=-fprofile-arcs -ftest-coverage") - -include(ProcessorCount) -ProcessorCount(NUMBER_PROCESSORS) -message("Number of processors: " ${NUMBER_PROCESSORS}) -if(NOT NUMBER_PROCESSORS EQUAL 0) - if(${JENKINS_GENERATOR} MATCHES "Unix Makefiles") - set(CTEST_BUILD_FLAGS "-j${NUMBER_PROCESSORS} -l${NUMBER_PROCESSORS}") - # Error using visual studio with multicore - #elseif(${JENKINS_GENERATOR} MATCHES "Visual Studio") - #set(CTEST_WIN_CXX_FLAGS "-DEPROSIMA_EXTRA_CMAKE_CXX_FLAGS:STRING=/MP") - endif() - set(CTEST_TEST_ARGS ${CTEST_TEST_ARGS} PARALLEL_LEVEL ${NUMBER_PROCESSORS}) -endif() - -# Check CMake version for QUIET parameter -if(${CMAKE_MAJOR_VERSION} GREATER 3 OR (${CMAKE_MAJOR_VERSION} EQUAL 3 AND ${CMAKE_MINOR_VERSION} GREATER 2)) - set(QUIET_ QUIET) -endif() - -ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY}) - -if(UNIX) - find_program(CTEST_COVERAGE_COMMAND NAMES gcov) - find_program(CTEST_MEMORYCHECK_COMMAND NAMES valgrind) -endif() - -set(CTEST_CONFIGURE_COMMAND "${CMAKE_COMMAND}") -set(CTEST_CONFIGURE_COMMAND "${CTEST_CONFIGURE_COMMAND} -DCMAKE_BUILD_TYPE=${CTEST_BUILD_CONFIGURATION}") -set(CTEST_CONFIGURE_COMMAND "${CTEST_CONFIGURE_COMMAND} ${CTEST_BUILD_OPTIONS}") -set(CTEST_CONFIGURE_COMMAND "${CTEST_CONFIGURE_COMMAND} ${CTEST_WIN_CXX_FLAGS}") -if(CTEST_COVERAGE_COMMAND AND NOT DISABLE_CTEST_COVERAGE) - set(CTEST_CONFIGURE_COMMAND "${CTEST_CONFIGURE_COMMAND} \"${CTEST_COVERAGE_C_FLAGS}\"") - set(CTEST_CONFIGURE_COMMAND "${CTEST_CONFIGURE_COMMAND} \"${CTEST_COVERAGE_CXX_FLAGS}\"") - set(CTEST_CONFIGURE_COMMAND "${CTEST_CONFIGURE_COMMAND} \"${CTEST_COVERAGE_EXE_LD_FLAGS}\"") - set(CTEST_CONFIGURE_COMMAND "${CTEST_CONFIGURE_COMMAND} \"${CTEST_COVERAGE_SHARED_LD_FLAGS}\"") -endif() -set(CTEST_CONFIGURE_COMMAND "${CTEST_CONFIGURE_COMMAND} \"${CTEST_SOURCE_DIRECTORY}\"") -set(CTEST_BUILD_COMMAND "${CMAKE_COMMAND} --build .") -if(WIN32) - set(CTEST_BUILD_COMMAND "${CTEST_BUILD_COMMAND} --config ${CTEST_BUILD_CONFIGURATION}") -endif() -set(CTEST_CONFIGURATION_TYPE ${CTEST_BUILD_CONFIGURATION}) - -ctest_start("${JENKINS_DASHBOARD}" ${QUIET_}) -ctest_configure(RETURN_VALUE CONFIGURING_RET_VALUE ${QUIET_}) -ctest_build(RETURN_VALUE BUILDING_RET_VALUE ${QUIET_}) -ctest_test(${QUIET_}) -if(CTEST_COVERAGE_COMMAND AND NOT DISABLE_CTEST_COVERAGE) - ctest_coverage(${QUIET_}) -endif() -if(CTEST_MEMORYCHECK_COMMAND AND NOT DISABLE_CTEST_MEMORYCHECK) - ctest_memcheck(EXCLUDE_LABEL NoMemoryCheck ${QUIET_}) -endif() - -if(NOT CONFIGURING_RET_VALUE AND NOT BUILDING_RET_VALUE) - message(0) -else() - message(255) -endif() diff --git a/QUALITY.md b/QUALITY.md index ccc06545d1e..2bcedf4de59 100644 --- a/QUALITY.md +++ b/QUALITY.md @@ -2,7 +2,7 @@ This document is a declaration of software quality for *eprosima Fast DDS* inspi # Quality Declaration -*eprosima Fast DDS* (formerly Fast RTPS) is a C++ implementation of the DDS (Data Distribution Service) standard of the OMG (Object Management Group). +*eprosima Fast DDS* is a C++ implementation of the DDS (Data Distribution Service) standard of the OMG (Object Management Group). eProsima Fast DDS implements the RTPS (Real Time Publish Subscribe) protocol, which provides publisher-subscriber communications over unreliable transports such as UDP, as defined and maintained by the Object Management Group (OMG) consortium. diff --git a/README.md b/README.md index 0e583c217e6..3aa4f3820da 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Fast DDS](doc/images/fastdds_github_banner.png)](https://eprosima.com/index.php/products-all/eprosima-fast-dds) +[![Fast DDS](resources/images/fastdds_github_banner.png)](https://eprosima.com/index.php/products-all/eprosima-fast-dds)
@@ -20,11 +20,11 @@
FIWARE Robotics - License - Releases - Issues - Forks - Stars + License + Releases + Issues + Forks + Stars Documentation badge
Status @@ -37,20 +37,22 @@

-*eprosima Fast DDS* (formerly Fast RTPS) is a C++ implementation of the DDS (Data Distribution Service) standard of the OMG (Object Management Group). eProsima Fast DDS implements the RTPS (Real Time Publish Subscribe) protocol, which provides publisher-subscriber communications over unreliable transports such as UDP, -as defined and maintained by the Object Management Group (OMG) consortium. RTPS is also the wire interoperability protocol defined for the Data Distribution -Service (DDS) standard. *eProsima Fast DDS* expose an API to access directly the RTPS protocol, giving the user full access to the protocol internals. +**IMPORTANT NOTICE** + +**Fast DDS is undergoing major changes implicating API breaks.** +**It is strongly advisable to use the latest stable branch, [2.13.x](https://github.com/eProsima/Fast-DDS/tree/2.13.x), to ensure compilation.** + +*eprosima Fast DDS* is a C++ implementation of the DDS (Data Distribution Service) standard of the OMG (Object Management Group). +eProsima Fast DDS implements the RTPS (Real Time Publish Subscribe) protocol, which provides publisher-subscriber communications over unreliable transports such as UDP, as defined and maintained by the Object Management Group (OMG) consortium. +RTPS is also the wire interoperability protocol defined for the Data Distribution Service (DDS) standard. +*eProsima Fast DDS* expose an API to access directly the RTPS protocol, giving the user full access to the protocol internals. Some of the main features of this library are: -* Configurable best-effort and reliable publish-subscribe communication policies for real-time -applications. -* Plug and play connectivity so that any new applications are automatically discovered by any other -members of the network. -* Modularity and scalability to allow continuous growth with complex and simple devices in the -network. -* Configurable network behavior and interchangeable transport layer: Choose the best protocol and -system input/output channel combination for each deployment. +* Configurable best-effort and reliable publish-subscribe communication policies for real-time applications. +* Plug and play connectivity so that any new applications are automatically discovered by any other members of the network. +* Modularity and scalability to allow continuous growth with complex and simple devices in the network. +* Configurable network behavior and interchangeable transport layer: Choose the best protocol and system input/output channel combination for each deployment. * Two API Layers: a high-level Publisher-Subscriber one focused on usability (DDS) and a lower-level Writer-Reader one that provides finer access to the inner workings of the RTPS protocol. *eProsima Fast DDS* has been adopted by multiple organizations in many sectors including these important cases: @@ -58,8 +60,8 @@ system input/output channel combination for each deployment. * Robotics: ROS (Robotic Operating System) as their default middleware for every ROS 2 long term (LTS) releases and most of the non-LTS releases. * EU R&D: FIWARE Incubated GE. -This project is part of [FIWARE](https://www.fiware.org/). For more information check the FIWARE Catalogue entry for -[Robotics](https://github.com/Fiware/catalogue/tree/master/robotics). +This project is part of [FIWARE](https://www.fiware.org/). +For more information check the FIWARE Catalogue entry for [Robotics](https://github.com/Fiware/catalogue/tree/master/robotics). ## Want us to share your project with the community? @@ -96,13 +98,13 @@ You can access the documentation online, which is hosted on [Read the Docs](http ## Quality Declaration -*eprosima Fast DDS* claims to be in the **Quality Level 1** category based on the guidelines provided by -[ROS 2](https://ros.org/reps/rep-2004.html). +*eprosima Fast DDS* claims to be in the **Quality Level 1** category based on the guidelines provided by [ROS 2](https://ros.org/reps/rep-2004.html). See the [Quality Declaration](https://github.com/eProsima/Fast-DDS/blob/master/QUALITY.md) for more details. ## Quick Demo -eProsima provides the eProsima Fast DDS Suite Docker image for those who want a quick demonstration of Fast-DDS running on an Ubuntu platform. It can be downloaded from [eProsima's downloads page](https://eprosima.com/index.php/downloads-all). +eProsima provides the eProsima Fast DDS Suite Docker image for those who want a quick demonstration of Fast DDS running on an Ubuntu platform. +It can be downloaded from [eProsima's downloads page](https://eprosima.com/index.php/downloads-all). This Docker image was built for Ubuntu 20.04 (Focal Fossa). @@ -125,54 +127,44 @@ This Docker Image comes bundled with the following: ### Shapes Demo -eProsima Shapes Demo is an application in which Publishers and Subscribers are shapes of different -colors and sizes moving on a board. Each shape refers to its own topic: Square, Triangle or Circle. -A single instance of the eProsima Shapes Demo can publish on or subscribe to several topics at a -time. +eProsima Shapes Demo is an application in which Publishers and Subscribers are shapes of different colors and sizes moving on a board. +Each shape refers to its own topic: Square, Triangle or Circle. +A single instance of the eProsima Shapes Demo can publish on or subscribe to several topics at a time. -You can read more about this application on the -[Shapes Demo documentation page](https://eprosima-shapes-demo.readthedocs.io/). +You can read more about this application on the [Shapes Demo documentation page](https://eprosima-shapes-demo.readthedocs.io/). To run this application once inside the Docker container run: $ ShapesDemo -eProsima Shapes Demo usage information can be found on the -[Shapes Demo First Steps page](https://eprosima-shapes-demo.readthedocs.io/en/latest/first_steps/first_steps.html). +eProsima Shapes Demo usage information can be found on the [Shapes Demo First Steps page](https://eprosima-shapes-demo.readthedocs.io/en/latest/first_steps/first_steps.html). ### Fast DDS Monitor -eProsima Fast DDS Monitor is a graphical desktop application aimed at monitoring DDS environments -deployed using the *eProsima Fast DDS* library. Thus, the user can monitor in real time the status -of publication/subscription communications between DDS entities. They can also choose from a wide -variety of communication parameters to be measured (latency, throughput,packet loss, etc.), as well -as record and compute in real time statistical measurements on these parameters (mean, variance, -standard deviation, etc.). +eProsima Fast DDS Monitor is a graphical desktop application aimed at monitoring DDS environments deployed using the *eProsima Fast DDS* library. +Thus, the user can monitor in real time the status of publication/subscription communications between DDS entities. +They can also choose from a wide variety of communication parameters to be measured (latency, throughput,packet loss, etc.), as well as record and compute in real time statistical measurements on these parameters (mean, variance, standard deviation, etc.). -You can read more about this application on the -[Fast DDS Monitor documentation page](https://fast-dds-monitor.readthedocs.io/). +You can read more about this application on the [Fast DDS Monitor documentation page](https://fast-dds-monitor.readthedocs.io/). To run this application once inside the Docker container run: $ fastdds_monitor -eProsima Fast DDS Monitor usage information can be found on the -[Fast DDS Monitor User Manual]( -https://fast-dds-monitor.readthedocs.io/en/latest/rst/user_manual/initialize_monitoring.html). +eProsima Fast DDS Monitor usage information can be found on the [Fast DDS Monitor User Manual](https://fast-dds-monitor.readthedocs.io/en/latest/rst/user_manual/initialize_monitoring.html). ### Fast DDS libraries and Examples -Included in this Docker container is a set of binary examples that showcase several functionalities of the -Fast DDS libraries. These examples' path can be accessed from a terminal by typing +Included in this Docker container is a set of binary examples that showcase several functionalities of the Fast DDS libraries. +These examples' path can be accessed from a terminal by typing $ goToExamples -From this folder you can access all examples, both for DDS and RTPS. We detail the steps to launch two such -examples below. +From this folder you can access all examples, both for DDS and RTPS. +We detail the steps to launch two such examples below. -To launch the Hello World example (a minimal example that will perform a Publisher/Subscriber match and start -sending samples) you could run: +To launch the Hello World example (a minimal example that will perform a Publisher/Subscriber match and start sending samples) you could run: $ goToExamples $ cd dds/HelloWorldExample/bin @@ -180,8 +172,8 @@ sending samples) you could run: split-window "./HelloWorldExample subscriber" \; \ select-layout even-vertical -This example is not constrained to the current instance. It's possible to run several instances of this -container to check the communication between them by running the following from each container. +This example is not constrained to the current instance. +It is possible to run several instances of this container to check the communication between them by running the following from each container. $ goToExamples $ cd dds/HelloWorldExample/bin @@ -193,9 +185,9 @@ or $ cd dds/HelloWorldExample/bin $ ./HelloWorldExample subscriber -Another example you could launch is the Benchmark example. This example creates either a Publisher or a Subscriber and -on a successful match starts sending samples. After a few seconds the process that launched the Publisher will show -a report with the number of samples transmitted. +Another example you could launch is the Benchmark example. +This example creates either a Publisher or a Subscriber and on a successful match starts sending samples. +After a few seconds the process that launched the Publisher will show a report with the number of samples transmitted. On the subscriber side, run: @@ -235,5 +227,4 @@ More information: rosin-project.eu eu_flag -This project has received funding from the European Union’s Horizon 2020 -research and innovation programme under grant agreement no. 732287. +This project has received funding from the European Union’s Horizon 2020 research and innovation programme under grant agreement no. 732287. diff --git a/UPGRADING.md b/UPGRADING.md index 59a4631d489..d9344f7438c 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -1,6 +1,6 @@ Upgrading from previous versions ================================ -If you have used *fastrtpsgen* to generate part of your code, it is always *recommended* to regenerate it. +If you have used *fastddsgen* to generate part of your code, it is always *recommended* to regenerate it. When upgrading from a version older than 1.7.0, regeneration is **required**. diff --git a/build_qnx/common.mk b/build_qnx/common.mk index e5bbef9c544..b9d694d8cb9 100644 --- a/build_qnx/common.mk +++ b/build_qnx/common.mk @@ -12,7 +12,7 @@ NAME=Fast-DDS FAST-DDS_INSTALL_ROOT ?= $(INSTALL_ROOT_$(OS)) # These commands require GNU Make -FAST-DDS_CMAKE_VERSION = $(shell bash -c "grep VERSION $(PROJECT_ROOT)/../CMakeLists.txt | grep fastrtps ") +FAST-DDS_CMAKE_VERSION = $(shell bash -c "grep VERSION $(PROJECT_ROOT)/../CMakeLists.txt | grep fastdds ") FAST-DDS_VERSION = .$(subst $\",,$(word 3,$(FAST-DDS_CMAKE_VERSION))) #choose Release or Debug diff --git a/cmake/modules/FindTinyXML2.cmake b/cmake/modules/FindTinyXML2.cmake index 44b8e645758..c05986ad7f9 100644 --- a/cmake/modules/FindTinyXML2.cmake +++ b/cmake/modules/FindTinyXML2.cmake @@ -2,7 +2,7 @@ # TINYXML2_INCLUDE_DIR # TINYXML2_SOURCE_DIR -option(TINYXML2_FROM_SOURCE "Integrate TinyXML2 source code inside Fast RTPS" OFF) +option(TINYXML2_FROM_SOURCE "Integrate TinyXML2 source code inside Fast DDS" OFF) # Option for evaluating whether we are looking in for tinyxml2 in submodule set(TINYXML2_FROM_THIRDPARTY OFF) diff --git a/cmake/packaging/Config.cmake.in b/cmake/packaging/Config.cmake.in index 01693a9a802..ea462700f8f 100644 --- a/cmake/packaging/Config.cmake.in +++ b/cmake/packaging/Config.cmake.in @@ -16,7 +16,7 @@ set(@PROJECT_NAME@_VERSION @PROJECT_VERSION@) @PACKAGE_INIT@ -@FASTRTPS_PACKAGE_OPT_BIN_DIR_CONDITION@ +@FASTDDS_PACKAGE_OPT_BIN_DIR_CONDITION@ set_and_check(@PROJECT_NAME@_BIN_DIR "@PACKAGE_BIN_INSTALL_DIR@") endif() set_and_check(@PROJECT_NAME@_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") @@ -25,67 +25,67 @@ set_and_check(@PROJECT_NAME@_LIB_DIR "@PACKAGE_LIB_INSTALL_DIR@") find_package(fastcdr REQUIRED) find_package(foonathan_memory REQUIRED) find_package(TinyXML2 QUIET) -@FASTRTPS_INSTALLER_DEPS_ANCILLARY@ -@FASTRTPS_PACKAGE_UNIX_OPT_DEPS@ +@FASTDDS_INSTALLER_DEPS_ANCILLARY@ +@FASTDDS_PACKAGE_UNIX_OPT_DEPS@ -set(fastrtps_known_comps static shared) -set(fastrtps_comp_static NO) -set(fastrtps_comp_shared NO) -foreach (fastrtps_comp IN LISTS ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS) - if (fastrtps_comp IN_LIST fastrtps_known_comps) - set(fastrtps_comp_${fastrtps_comp} YES) +set(fastdds_known_comps static shared) +set(fastdds_comp_static NO) +set(fastdds_comp_shared NO) +foreach (fastdds_comp IN LISTS ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS) + if (fastdds_comp IN_LIST fastdds_known_comps) + set(fastdds_comp_${fastdds_comp} YES) else () set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE - "fastrtps does not recognize component `${fastrtps_comp}`.") + "fastdds does not recognize component `${fastdds_comp}`.") set(${CMAKE_FIND_PACKAGE_NAME}_FOUND FALSE) return() endif () endforeach () -if (fastrtps_comp_static AND fastrtps_comp_shared) +if (fastdds_comp_static AND fastdds_comp_shared) set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE - "fastrtps `static` and `shared` components are mutually exclusive.") + "fastdds `static` and `shared` components are mutually exclusive.") set(${CMAKE_FIND_PACKAGE_NAME}_FOUND FALSE) return() endif () -set(fastrtps_static_targets "${CMAKE_CURRENT_LIST_DIR}/fastrtps-static-targets.cmake") -set(fastrtps_shared_targets "${CMAKE_CURRENT_LIST_DIR}/fastrtps-shared-targets.cmake") +set(fastdds_static_targets "${CMAKE_CURRENT_LIST_DIR}/fastdds-static-targets.cmake") +set(fastdds_shared_targets "${CMAKE_CURRENT_LIST_DIR}/fastdds-shared-targets.cmake") -macro(fastrtps_load_targets type) - if (NOT EXISTS "${fastrtps_${type}_targets}") +macro(fastdds_load_targets type) + if (NOT EXISTS "${fastdds_${type}_targets}") set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE - "fastrtps `${type}` libraries were requested but not found.") + "fastdds `${type}` libraries were requested but not found.") set(${CMAKE_FIND_PACKAGE_NAME}_FOUND FALSE) return() endif () # find related dependency packages like OpenSSL - @FASTRTPS_INSTALLER_OPT_DEPS@ - @FASTRTPS_PACKAGE_WIN32_OPT_DEPS@ + @FASTDDS_INSTALLER_OPT_DEPS@ + @FASTDDS_PACKAGE_WIN32_OPT_DEPS@ - include("${fastrtps_${type}_targets}") + include("${fastdds_${type}_targets}") endmacro() -if (fastrtps_comp_static) - fastrtps_load_targets(static) -elseif (fastrtps_comp_shared) - fastrtps_load_targets(shared) -elseif (DEFINED fastrtps_SHARED_LIBS AND fastrtps_SHARED_LIBS) - fastrtps_load_targets(shared) -elseif (DEFINED fastrtps_SHARED_LIBS AND NOT fastrtps_SHARED_LIBS) - fastrtps_load_targets(static) +if (fastdds_comp_static) + fastdds_load_targets(static) +elseif (fastdds_comp_shared) + fastdds_load_targets(shared) +elseif (DEFINED fastdds_SHARED_LIBS AND fastdds_SHARED_LIBS) + fastdds_load_targets(shared) +elseif (DEFINED fastdds_SHARED_LIBS AND NOT fastdds_SHARED_LIBS) + fastdds_load_targets(static) elseif (BUILD_SHARED_LIBS) - if (EXISTS "${fastrtps_shared_targets}") - fastrtps_load_targets(shared) + if (EXISTS "${fastdds_shared_targets}") + fastdds_load_targets(shared) else () - fastrtps_load_targets(static) + fastdds_load_targets(static) endif () else () - if (EXISTS "${fastrtps_static_targets}") - fastrtps_load_targets(static) + if (EXISTS "${fastdds_static_targets}") + fastdds_load_targets(static) else () - fastrtps_load_targets(shared) + fastdds_load_targets(shared) endif () endif () diff --git a/cmake/packaging/windows/fastrtps-config.cmake b/cmake/packaging/windows/fastrtps-config.cmake index ee4a8b9ad95..f8b17d560d1 100644 --- a/cmake/packaging/windows/fastrtps-config.cmake +++ b/cmake/packaging/windows/fastrtps-config.cmake @@ -16,8 +16,8 @@ if(MSVC_VERSION LESS_EQUAL 1900) message(FATAL_ERROR "Visual Studio version ${MSVC_VERSION} is no longer supported") else() if(CMAKE_CL_64) - include("${CMAKE_CURRENT_LIST_DIR}/../share/fastrtps-x64Win64VS2019/cmake/fastrtps-config.cmake") + include("${CMAKE_CURRENT_LIST_DIR}/../share/fastdds-x64Win64VS2019/cmake/fastdds-config.cmake") else() - include("${CMAKE_CURRENT_LIST_DIR}/../share/fastrtps-i86Win32VS2019/cmake/fastrtps-config.cmake") + include("${CMAKE_CURRENT_LIST_DIR}/../share/fastdds-i86Win32VS2019/cmake/fastdds-config.cmake") endif() endif() diff --git a/colcon.pkg b/colcon.pkg index d71654b9523..8e78ca24b51 100644 --- a/colcon.pkg +++ b/colcon.pkg @@ -1,5 +1,5 @@ { - "name": "fastrtps", + "name": "fastdds", "type": "cmake", "dependencies" : ["fastcdr", "FOONATHAN_MEMORY", "foonathan_memory_vendor", "googletest-distribution"] } diff --git a/doc/README.html.in b/doc/README.html.in deleted file mode 100644 index 95c615285c0..00000000000 --- a/doc/README.html.in +++ /dev/null @@ -1,1273 +0,0 @@ - - - - - - - - - -



- - - - - - - - - - -
-

eProsima
Plaza de la Encina 10-11
Nucleo 4, 2ª Planta
28760 Tres Cantos (Madrid)

-
-

-

-

Fast DDS v@PROJECT_VERSION@

-

Email: support@eprosima.com
Phone: +34 91 804 34 48
www.eprosima.com

-
-


-

-Available documentation:

-


-

-Local:

-


- -


-

Online (updated frequently):

-


- -


-


-

Copyright© 2019 eProsima. All rights reserved.

-

This copy of eProsima Fast DDS is licensed to you under the terms described in the LICENSE file included in this distribution.

- - diff --git a/doc/design/intra-process.md b/doc/design/intra-process.md deleted file mode 100644 index 89ee6c7ea93..00000000000 --- a/doc/design/intra-process.md +++ /dev/null @@ -1,93 +0,0 @@ -# Intra-process delivery - -Several requirements, each with a section. - -## Identifying local endpoints -Endpoints on the same process have the same content on the first 8 octets of their GUID prefix. - -### GUID_t refactor -* Provide methods `is_builtin()`, `is_on_same_process_as(other_guid)` and `is_on_same_host_as(other_guid)` -* Consider other improvements - * Split Guid.h into three headers (guid, prefix and entity_id) - * Converting EntityId_t to uint32_t - * Use a union on GuidPrefix_t to efficiently compare parts of it - -### Getting pointers to local endpoints -* Add methods on RTPSDomain to return a pointer to reader/writer given its guid -* Should be aware of builtin endpoints - -## Intra-process reception -The processing of new data on the subscribers is performed by the thread writing the data. -This thread is in charge of copying the `CacheChange_t` into the `ReaderHistory` and calling `NotifyChanges()`. -This decision was taken to maintain consistence with how currently operate the reception threads coming from transport -layer. - -User's documentation should make clear any user's listener registered to be informed about new changes implies having -blocked both the transport's reception threads and threads which write data. -Also should explain there is another mechanism to read samples, using the function `wait_for_unread_samples()` from the -user's thread and then taking/reading them. - -Current Reader API will be used by local writers to deliver data. The local writer will call `processDataMsg` directly. - -## Readers: management of local writers -When matching a writer, the reader should check if it is on the same process. - -**Considerations at destruction time** - -Until now a reader was safe to be destructed because we are sure that no thread will access it. This is possible because: - -* All events which use the reader were destructed first. Then the event thread will never access the reader. -* The reader was deregistered from the `ReceiverResource` objects. Then any reception thread will never access the -reader. - -Now a reader can be accessed by a writer from the local process. But it was accessed if there was a match with the -writer using discovery. Therefore, we should make sure there will be an unmatch with the writer using discovery before -the reader is destructed. And this unmatch will be instantly because the EDP builtin endpoints will use intraprocess -mechanism. - -### StatefulReader -No output traffic to local writers should be performed. -* Changes on WriterProxy - * `remote_locators_shrinked` should return an empty vector for local writers - * Timed event `heartbeat response` should never be started for local writers - * Timed event `initial acknack` should directly call `process_acknack` on the local writer - -## Writers: management of local readers -When matching a reader, the writer should check if it is on the same process. -* No output traffic to local readers should be performed. -* Samples are sent to local readers using `processDataMsg`. -* When a local reader is matched, and transient_local durability is used, the reader should automatically receive data -with `processDataMsg`. - -### StatelessWriter -* On ReaderLocator::start, no locators should be added when the reader is local - -### StatefulWriter -* Samples sent to local readers are automatically acknowledged -* Gaps sent to local readers should directly call `processGapMsg` -* Heartbeats sent to local readers should directly call `processHeartbeatMsg` -* Timed events should never be started for local readers, except for an `initial heartbeat` - -## Discovery process - -### Participant discovery (PDP) -In order to keep the sepparation of domains while on the same process, we will leave participant discovery to the standard mechanism. -No intraprocess delivery will be used for builtin PDP readers and writers. - -### Endpoint discovery (EDP) -We will leave endpoint discovery to the standard mechanism, but builtin endpoints will use the new mechanism to -send/receive `WriterProxyData` and `ReaderProxyData` to/from the ones on the local process. - -## Additional considerations - -### Security -If we rely on the comparison of the GUID to identify endpoints on the same process, those belonging to a secured participant will not be taken into account, as in that case the GUID is recalculated using a hash of the whole participant GUID. - -### Liveliness -No changes are necessary for the liveliness assertion mechanism, except that manual_by_topic assertions should directly call `processHeartbeatMsg` on local readers. - -### Side effects - -* This design isolates all message traffic from the wire, that is, tools like **wireshark™** will become useless. Given that most of our customers actually run intraprocess code, and report their issues using **wireshark™** traces, these changes will create a support nightmare. A workaround may be to supply a flag to inhibits the intraprocess behavior for debugging purposes, stating clearly, that it should be turn off during performance test. - -* Once a shared memory transport is developed for interprocess purposes, an intraprocess mechanism would be pointless. That's because the trade off between speed gain and source complexity would be very expensive. From memory consumption point of view using an interprocess discovery database would yield more benefits that having per-process discovery databases. diff --git a/doc/design/shared-memory-transport/interprocess_shared_mem.md b/doc/design/shared-memory-transport/interprocess_shared_mem.md deleted file mode 100644 index 1f650474a1e..00000000000 --- a/doc/design/shared-memory-transport/interprocess_shared_mem.md +++ /dev/null @@ -1,105 +0,0 @@ -# Interprocess Shared Memory model - -## Overview - -This document describes a model for interprocess shared memory communication of software components interchanging data messages. The objective of the model is to provide a shared memory based transport layer suitable for a Real-time Publish-Subscribe DDS (Data Distribution Service). - -## Context - -eProsima has received commercial proposals to implement a shared memory transport as an improvement of its FastRPTS product. The goals listed in this document are extracted from the customers proposals. - -### Improvements over the standard network transports - -* Reduce OS Kernel calls: This is unavoidable for transports like UDP / TCP (even with the loopback interface). -* Large message support: Network stacks needs to fragment large packets. -* Avoid data serialization / deserialization process: This is not possible in heterogeneous networks, but is possible in shared memory interprocess communication. -* Reduce memory copies: A buffer can be shared directly with several readers without additional copies. - -### Objectives - -* Increase the communications performance of processes in the same machine. -* Create a portable shared memory library (Windows / Linux / MacOS). -* Documentation. -* Tests -* Examples / Tutorials. - -## Architecture - -### Design concepts - -* **Segment**: Is a block of shared memory of fixed size that can be accessed from different processes. Shared memory segments have a global name so any process who knows the name can open the segment and map it in its address space. - -* **SegmentId**: SegmentIds are names that uniquely identify shared memory segments, these names are 16 characters UUIDs. - -* **Shared memory buffer**: Is a buffer allocated in the shared memory segment. - -* **Buffer descriptor**: Shared memory buffers can be referenced by buffers descriptors, these descriptors act like pointers to a buffer that can be copied between processes with a minimum cost. A descriptor contains the SegmentId and the offset to the data from the base of the segment. - -* **Shared memory port**: Is a communication channel identified by a port_id(uint32_t number). Through this channel, buffer descriptors are sent to other processes. It has a ring-buffer, in shared memory, where descriptors are stored. The same port can by opened by several processes for reading and writing operations. Multiple listeners can be registered in a port to be notified when descriptors are pushed to the ring-buffer. Multiple data producers can push descriptors to a port. The port contains an atomic counter with the number of listeners registered on it, each position in the ring-buffer has also a counter initialized to the number of listeners, as listeners read the descriptor, decrement the counter, so the ring-buffer position will be considered free when the counter is zero. The port also has an interprocess condition variable where the listeners will wait for incoming descriptors. - -* **Listener**: Listeners listen to descriptors pushed to a port. The Listener provides an interface for the application to wait and access to the data referenced by the descriptors. When a consumer pops a descriptor from the port listener, look at the descriptor's SegmentId field to open the origin shared memory segment (if not already opened in this process), once the origin segment is mapped locally, the consumer is able to access the data using the offset field contained in the descriptor. - -* **SharedMemoryManager**: Applications instantiate this object in order to access the shared memory resources described above. At least one per process memory manager is required. The manager provides functionality for the application to create shared memory segments, alloc data buffers in the segments, push buffer descriptors to shared memory ports and create listeners associated to a port. - -### Example scenario -![](interprocess_shared_mem1.png) - -Let's study the above example. There are three processes with a SharedMemManager per process, every process creates its own shared memory segment intended to store the buffers that will be shared with other processes. - -P1, P2 and P3 processes are participants in a RTPS-DDS environment. Discovery of participants is done by using multicast, so we have selected shared memory port0 as "multicast" port for discovery, therefore, first thing all participants do is to open the shared memory port0. A listener attached to port0 is created too, by every participant, to read the incoming descriptors. - -Each participant opens a port to receive unicast messages, ports 1, 2 and 3 respectively, and create listeners associated to those ports. - -The first message the participants send is the multicast discovery message: "I'm here, and I am listening on portN". So they alloc a buffer in its local segment, write that information to the buffer and push the buffer's descriptor through the port0. Observe how port0's ring-buffer store the descriptors to Data1a(P1), Data2a(P2), Data3a(P3) after all processes have pushed their discovery descriptors. - -After the discovery phase, participants know the other participants and their "unicast" ports so they can send messages to specific participants by pushing to the participant's unicast port. - -Finally, let's observe how P1 is sharing Data1c with P2 and P3, this is done by pushing the buffer descriptor to P2 and P3 unicast ports. This way one shared memory buffer can be shared with several processes without making any copy of the buffer (just copy the descriptors). This is an important improvement with respect to transports like UDP and TCP. - -### Design considerations - -* **Minimize global interprocess locks**: Interprocess locks are dangerous because, in the case one of the involved processes crashes while holding an interprocess lock, all the collaborating processes could be affected. In this design, pushing data to a port and reading data from the port are lock-free operations. For performance reasons waiting for data on a port, when the port is empty, requires interprocess lock mecanishms like mutexes and condition variables. This is specially dangerous in multicast ports because if one listener crashes while waiting this could block the port for the rest of the listeners. More complex design features could be added to make the library fault-tolerance, but it will possibly be at a cost of losing performance. - -* **Scalable number of processes**: Every process creates its own shared memory segments to store the locally generated messages. This is more scalable than having a global segment shared between all the involved processes. - -* **Per application / process customizable memory usage**: Again, a local shared memory segment allows to adapt the size of the segments to the requirements of the application. Imagine for example an application sending two types of data: Video and status info. It could create a big segment to store video frames, and a small segment for the status messages. - -### Future improvements - -* **Fault tolerance**: As stated in the design considerations, the possibility of a process crashing holding interprocess resources is real. Implementing fault tolerance for these cases is not an easy task. Timeouts, keep alive checks and garbage collectors are some of the things that could be added to the initial design in order to achieve fault tolerance. This will be considered in future revisions. - -### Mapping the design to FastRTPS - -#### Transport Layer - -* **Locators**: LOCATOR_KIND_SHM Is defined to identify shared memory transport endpoints. Locator_t fields are filled in this way: - * kind: 16 (Is the RTPS vendor-specific range). - * port: The locator's port contains the shared memory port_id. - * address: The whole address is set to 0 except for the first byte that is used to mark unicast (address[0]='U') or multicast (address[0]='M'). - -* **SharedMemTransportDescriptor**: The following values can be customized: - * segment_size: Size of the shared memory segment reserved by the transport. - * port_queue_capacity: Size, in number of messages, of the shared memory port message queue. - * port_overflow_policy: DISCARD or FAIL. - * segment_overflow_policy: DISCARD or FAIL - * max_message_size: By default max_message_size will be the segment_size, but is possible to specify a value <= segment_size. In that case fragmentation could occur. - -* **Default metatraffic multicast locator**: One locator, the port will be selected by the participant (will be the same as in the RTPS standard for UDP). - -* **Default metatraffic unicast locator**: One locator, the port will be selected by the participant (default port_id will be the same as in the RTPS standard for UDP). - -* **Default output locator**: There will be no default output locator. - -* **OpenInputChannel**: A SharedMemChannelResource instance will be created. An opened channels vector is maintained, if the same input locator is opened several times the channel instance is reused. - -* **OpenOutputChannel**: There will be only one SharedMemSenderResource instance per transport instance, an unordered_map of opened ports will be maintained by the SharedMemSenderResource object in order to match the destination locators to the shared memory ports. - -## Class design -![](interprocess_shared_mem2.png) - -#### RTPS Layer - -In FastRTPS transports are associated to participants, so the new SHM transport can used, by adding an instance of a SharedMemTransportDescriptor class to the list of participant's user transports. -So there is a shared memory segment per participant that will be shared by all participant's publishers. - -Transport selection: As RTPSParticipant is able to have multiple transports, a transport selection mecanishm is necessary when communicating with other participants reachable by several transports. The defined behaviour here is: If the participants involved are in the same host and both have SHM transport configured, then SHM transport is selected for all communications between those participants. diff --git a/doc/design/shared-memory-transport/interprocess_shared_mem1.png b/doc/design/shared-memory-transport/interprocess_shared_mem1.png deleted file mode 100644 index 3187e9ad53417abef858bf18a84c7f0546292af8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86126 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 oAzg)AJw5N&o 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�h0j3q{MRgCWtaE-18Pe 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 Z2R^&w*> - -class SharedMemTransport { - ..Channel handling.. - +OpenOutputChannel() - +OpenInputChannel() - +Send() - .. - -input_channels_ -} - -struct(SharedMemTransportDescriptor) { - ..Interface implementation.. - +min_send_buffer_size() - +max_message_size() - ..Additional configuration.. - +segment_size - +port_queue_capacity - +port_overflow_policy -} - -class ChannelResource { - -} - -class SharedMemChannelResource { - +Receive() -} - -class SenderResource { -} - -class SharedMemSenderResource { - -locators_ports_map -} - -class SharedMemManager { - +create_segment() - +open_port() -} - -class SharedMemManager::Port { - +push() - +create_listener() -} - -class SharedMemManager::Listener { - +pop() -} - -TransportInterface ()-- SharedMemTransport -TransportDescriptorInterface ()-- SharedMemTransportDescriptor -ChannelResource <|-- SharedMemChannelResource -SharedMemTransport o-- SharedMemManager -SharedMemTransport "1" *-- "n" SharedMemChannelResource -SenderResource <|-- SharedMemSenderResource -SharedMemTransport "1" *-- "1" SharedMemSenderResource -SharedMemChannelResource "1" *-- "1" SharedMemManager::Listener : listen on -SharedMemManager::Listener "1" o-- "1" SharedMemManager::Port -SharedMemSenderResource "1" *-- "n" SharedMemManager::Port : send to - -@enduml -``` \ No newline at end of file diff --git a/doc/design/shared-memory-transport/interprocess_shared_mem2.png b/doc/design/shared-memory-transport/interprocess_shared_mem2.png deleted file mode 100644 index 67b022e7a30d2c8416aef0ce614e43cf308f48ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37242 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

>7xB-Ml~=rwA*|( zq0))GIUQZ%!9lA%>n-t>W+dvW2>d4ai$7pxZ-0LQXE{`w>F5{$%9}C4;j|Z8_Kjqh zy(v2_`cf^}fHG%wx0Lq2j@>*@L;g#acSPH`EAcVTov(R2_lXQr%~aYz|T6ld|+mm;-fEW&QZ_BbdX z!`RCGwdT8=D7DE+su6cl;(7RodybKP{55IXOt1BWo8I-jw0})NTB1bSZ;^v&^hHq< zE>QQN{Jl^P3-{s*XcQHmG(Zif7RB}k>R|?$2!i6scn$@#`0IhoTDRd53}&53v$453QEPf#aA5$rkzsfVBn;?vh1T>sd6h_% zm6aQS%h8dgUaDbYLIk{IJ-y3x_{yb$f=0GQuNcT5xQh;h;f#gv=Djge@ue^+=HSUR z$@V9*wD7L{-vT_2u+WuDrr{s^Y1%hT@&l^@F682J(gLr8&2Zd@rC%asJZ`CwG%5s1 zug_B7mJeNpS2T~HubTGJ#vC^Tmz&P^;OZg7kY4Z&^C`K10!V=gD^vyd#UBYfOmJKizv`u<^h03I!0 z=v^U;4F6EEF$*er?zwNfB2a8^0;M>MAI7rqqTsymfxy%NhGOCd(?O^Oz=+rfS=K^d zfA$oVPGwc=3+<8moJI6GaB`li`cI|*r@EaZ)gUiLdORy6hLdnYmaiJ=$PDvd=wfGy z5=2jD6`~2T`O3+8tlwgdf<~mIxestQ5v&3hKL13L4Ug_+2hsUFp)7t$w{aUPtRT27 z=M+De*kP>a_P_UjxQ6*hasRbvmfazuvzMCNH4-`3c!o0sHg|!_G9CaTXOEWhMF_*f z!e&VXY~YV`&8WiRARv*z3Ph3Xhopq$izK$+lap3PIT>N?OV;%n;ZSRqfG?bQz=~gV zN2pmakbt=(Amsu@BUs0Pj|##kC zpoXTVYYi~=6Unos>Z(U6koo7igO((8{bnsO6b4-aA73tO%ZI;exbV&$ediv3(GL76 z@Z}DGKXH@7gfn~D@+qUNjFX#Nw9axc3EN6Pk_m^ClM`k16x=ql0}`U>AR2b?c-uWw zBI8>EyE|=S|NcYsT?07n;zm2-MZK8rvE2xZ`w=9Pj1`q1ze*WTFD0ZkK~X5is%rDb z&A(9tAueA}8Y^p|&qguQTPlyv9S~ITd`~=c4jb8d(KBMU?kS4T3v+$VmhyfNXR$HA z?!)m+1hxkve9NVKaT0U=8E!$0dCm7zR5s@-8fFNDD|%pKv#TYbl-^JuAB^s4P4<|h zh>R?_&|>A+>Omy)svAKN!4V;t7u~eD=5$M(c!2Ou#2uPly~;_8hUyn z@5~k;mlnwV`As150!xY!xxnwDq6s`thc&Oa3cu38wJnW{zWCK`CwP*#+plcu`@jVy z;6F3A?9~k|R)N&Fo;X7%D@}Zraw!5O_&CNckK2tTUXlI~IFt9SM?Lt5mQ;Nr45s81 z6uIO~;F=XaNEo=f#bNjGa2k;LCmzj)r4?#v;~KloAk)8S=jhnc(%C8H)G}3IM#cH$ ziR9Ofbn@%zi3wM50iW@~>A$}0DBb945X`!-&Ch3g*DDT2maM7mJD2X$dSfX&1J1U_ zhx%iDzMcIB0bJhQot?MZ00{A==vC}--~ZW2K#0odp>6SrMd#$?*o*hp%#U`<(I-=2 zQeV`D@=w#F5E^{yXM)V_sfV9)N~1oL^B)uqW0RXRqeN9>OjS&ePowbROft9Mp}N@* zEt5s;LK!9?q{*AiXBVuZd^l>8-QKZg99F?*E+f>;e8prFkI$JPZgVD&v|?n7k|inP z6|Vu67w*j}B9#Wibg3CwI=UvDF=$FjuXS}V3_)^50%QS#1Zn8&)k2w=$ncoK?L38C zw>Ee)xnQ>jQBqRg`&ceWfU)#4?x|{%Ab-Y)tgI|>Q%-ZV<5`=$bDkIy z>V0P*qlkDPF#(&>6!ZM8uL)g$!Iv*MryIj^qB)W)V?SR$A={g+-@J)#2^UlYzMwJ) zHJGo-e72)`xZMVyw+)J13X%dh(m0_0sAy>@~8-1ay6ub6SODc-;3rjFx!;zwFWZ5{s)UZ*mV{EmSXLHg9 zMk9bm!+13om7Abg)OnqE|1a+a@X9<`72cGdw^__V5ijebC9xeZ9W6- zddb7n)3|W=N@+T)*Y#%|9SEV`{EZ>!>Cn~HjU4Q=utJ@(O1ZNb!$zeh+~Wu?+-N&-2VzM-MtCphascT-#pHj><%Je7AP+5lYahY>aG8#cLnov5+mzX||GoAR>v|XL*bT3r;l#A?GC#^#LMuV-IW7&b(9$6XI%Ov~ zS@(xP^q#jMFUaYM{1u0UIa2)HE7_rVerG!2Awg@C;zIw-5J=jc7uUB$K*ZE$AmU5V zcAOR@5X#z*%gxMikOuB9NZaKBV+iS&D%vy&TN!K{_=<;G<}$ z_-IjMW1}^&n(%R$#T2c_^s5?APF#W02aM{t-;lb#M|6Y_?#*kmbqwndt0KUmehk_{ z&hEMIqqTQG<22w`=ezS@s`lw<{ro<-??`-<70kPVc+)K8CrGeY81QIKSmi(DvcQx@ zzc|CIk03Hz53o(|i$n$^AaW#E+htlTw)x-_z&UlvA`l)qZ^$CjtTLuOaOlFbvg!-&+A>slWIU{x3q`5(w@@x|NR+ee_8w8XlX8;v-fMPmGU7r?D=K2mBS|%HFP3>mBb^xUDT_S zoAo7{P^+|tbQwin+}8QhJ`0VJnU5MRt1GIkJeHyS|FLuyKvk`8+uxgJ)7{;|p{1oe zq(r(~5$TZbknWI{5RjIR4M<6gNH@|cNXPf^|K1tL@ywY~SggI)eP8i=R;Jrgq6Ihv zL@16`!ZSJaHCxigy7NXWIJA7R*YI=%rSyp@i)mYf!a}}I^yJv_kkJ36Cp*L&GnSm}=TM9iRbth8{v#N!IUvkM@Nat?2gl zcJ!7vFOl^$mCdc&)Z7@p39zuo^*nRlIJ<^BF9y!+FO6`I@BwJma&{8qKSR`AuN5vd zpiq*6=g^p!ll4;WI|0M*`~M!=0ZPRboi0lU!D=)1YW{8Yi+-l0xhv6Juk|RuaPyJO z9rG+jMk8;^eAA#uE(C=HjED)V@-Yrh2F6ww*r}!S|AKJ-9{8u=rHO)x21 zx6A@o#;48jJ*m9iW^vHAHz6S*I6{sG+)8_U`0v{e1pr&D@kia=BTxx*caM*`I6+r3 zp(-7jl}K)qgwyB>OA6ONSGgDjx01D#OEApzPj!hudiy@wD2t!oUL4-;N7XoysY{!J z-7O%Z*BsOWNjZjXkUxHH0SO(fyzz7`!aqS@4VxaatM>1P07>JE4pQp@C}4SVW1fXf z8vP|e&{OYdutZv>Rb+ccuS7=4Dp08(_;cNthsI9Gzqr)f^8gsc4IFf}?g z>)mS!aBZmSAZPLq9I?nGPgF4YNu~A<5r?yk(?SgUluk`h5*^BfgaoOe0Juw<^_PM- zFl9Wq>w>oSz)vFkR#;{BlB}HaJ1w^b*d9S=M4x!x(T39EN7VpiT=T!*hNr)@)eEYt z-~V*K2VgYNKlzhxn)`y3BdxNw*15kvlV5Gv=C|5k{qm~)`(Ro-pl{GAB{lA}E_Z@N z>LCCj90MgKe_sT%Hv`ZygBBANtweMdY{BPMh_mx*{g{Z5@UFd}0Gg&^xoI=%ObIp( zzZezvUb9TcrnZ2>v%Vxsuy}U9-Thhon6Ankfkv11^Dfk_g2O5OWvTP#Al?&04gmFl z-3cPkTfi};$+J8Ci`gtoi@W0o>f?2eB66BelX4`n!ehij6q!3ukyVg&)Twy=grNc1 zve*4q@=a_?Y-({xHUA5OoZx`?80UKsSswu@+0HNEDafBwF$p&h2nf&wKmA1etb)Wt z&;680TF6}?_< zi{}3^(T@>+OZX3QPX4f+v9U|Z|JZ&%@GED-b;17sx9*0>x zaG?Kbg2A!{)DhkT-IPf$?GH=cU+_B`T_PeXw%eIlwF!9pf=KhmYpnJ!c7vc#r=M1T zFs)jPy75Iy{k(-Ze;0Jv3^g?1MsAaGTc^-|Pyz??11QoKeMy`GPbXb~oa*9EH1lMa z6eWbEK5>cKK=mPjT?rp7z#vhCQ#~VUo-Y6jo1@u+8)tcsV&IDhC8rP)U}i4>$6^u0 z>tjAp5#y>&|Nh+xvJUl?y5L(9a9l)VH}h-vB(qOcL}J$kSAWJd9&Az|q-6%yLjYR% zRa?8h0?gG*AXoYW^?~%m^`GiY5jNyyww24Vapcxapp`EX*5Qq9tH8g zc#EDZe)%b#o}etVa&k~V{^0H8RKqAC5%7xnZ73(zQ)`C;w7mI%13E0Mc1cc%1O?U_ z2oH*_(Z6X)1z>?Y9Y~Mt`riL2jO<{ayd)oRMzUl#r~rwSG47c6?KK$t#$b1NwlF_0 z{&f9mUdmU4sP3r-8bbU}dKz+aQK!%Bp=K+%l$=mq2P5q287%$Rr3$pzl3LG4_A7i% z2{BzCa>uUTTsibQ*3Kd6dtfJaZqmbUjGV)6ZKRb#LbNEY-+9e;7qk~ZTML8#c(aDK zZyLXLS3h^!#>uzY!yjY*fiFA=)&NHuUo$D4#I;8B_!uPpP_2wmsm0wO2_hLO2i#m) zLgxt7944JW$J9yT@l1ah@U0QTrVv2jXC&}Ip(1TSKO`IMoQ z#XlZxw?uMmxshAxM1#vfB5tbMHw0a#yoO&bES;6%(9ltv;qr7aW#7Ak*I-^2YjYhZ z%AY@fVnHZmvEHmZ_`nyW@4*+u0EMLsU&Wx0u!Ax3KjM#>K!OCk%Mo6V*W?|2_y&&u zv3IIY@jsQT6a8*4{Mf-A9iOTu7_4;88eKQR9pfoq6}5}sm~-gIiXUYL3N*7#?`c2@ zJdPc#pVhhETbZ`&r_K9Tf1*I30L0twCBe3o4%}5$_9ItjWfc8%rMz*$XR}8K2SzI^ zD*-{sC(K@K!$2e)qv1m8{`uQgB!@sb8a!kH&ki7LuFw0x$0Tpbk>-I? z2&q%X4DV1K{2Lo`)<^N$$&}~Xh{l-l7lph+7gV8N>`#OaSLGf|xl1J_Sx>1x6G>)R ztJSW}hpB4c!tc-6F{pqoLLnm<-~BmM%Z>vz)_P4{*8HQqW-(L#>sJ=>yTLZ(nT>ft zt3L=NEyiDertk>DAh$)W3k)tRtkLVW2;+Q?rIAaHUCL7pZU24y zS9`M%%`(({cm!sZfCvCkN`!pGMF4eUrKFdvdO7GNNB^<2`&5CH!WnoR5m?j$ZV;o= zI(S{)Gvtkv{Kv-T?f1;j208ojdOYAE8)(+!A^{EWN*=CQtIfPjI#9sx+8*1BykH*Y4Xh_`~}WX`Z3RnVxZ-5JUl}@KmO^y(Vp0uU-#BJ-d?RZtP*w+W5fgCYB?LWwNq0p#-Q}g(!2;x(r zahcVoqcmHsW@v9Pxk$=U(ZojLRIadB(r9K@2^)wNU-@?0S07t1HG@7=y+g0+lJ8d; zYp_azTDwpxFP=6JFpa_Zik!{oer1;x4sZaCVHhM2fHsK=@Q%2F|F&I8jGVf0R8&+h z!+Y1zG2Yqi&FDy6%vzeRG`=$w$d26*0&ln6?OOl)51`KttQV^Qpqv8#Z4~@Poerr< znLB*%1fKE}i}$ye5>M0@fbYALU5}HmLw0O3^g8V$>GEIkySyLSI7K5+o2XfI;Y_dS z0^-+~?rteSzIduNG&B%CWevT(g@O8@0R~^d#?{dIMhw4(a0<-PK+ z(Jz2Q<8{=s4ZgE5P}S@2mj?kufZs68bOjlVxt{_6Nd-FOt|%ehKce19X(|&*f%95u z;WxFsG~)th*3-U#F9Y6;Bh1xchVJ>1%6@D^%AEPKw7xcQ(vA>NedBdN(Yd3Lbzaft zLkXt_&^1B%9&`hM-v)kxKNJ@igZG-zJP@xsbbi~{9p>$fTa7w4SzaD3H32BEi6$Ya zpN)*O@#wK28om~Bpik_1xW_uV71L{Rp>v>Sp|9Qi%$u}q+8p>fn>Lj4{-C^Y;h14l z9kq>seU->&+*n9#7!vm+M3^JQr;a(VD5D#w%7v|6O6hkXSS&$t<;ccp8=O~UF{)jj7m48g(?raKvHUS-t4$G;YOAc*i|+ zt5via43bB8zH7hmAKd#s!2pM@^^e?%t(}yuoF*WKW>tOpA|*tb`}gY%0uhTSVcLI& z;fjpGrFs73$K7lB0Ei+K{*@@cm^FGE3^$M7pg;B@e&8${s13%2 ztj`8`6z3Xkd9N2+tE%n6bnOc&a0&o7z|7$FMoIfg5)q!_$1$iQ1Q5z^--v+HtbeJ+ zyj-&6*raafu;eHRstsK89X^*ckULL#Ht~J(ZwrU|Ur>ktv$F<`iXh_Q7$~j;22ykvTR=G10U81E2jH$b` zwcPLPmxwF2_C2mhW_q$dN$hAl+I^{=6wrA&B4l|u4oEcZ9C9JpqvLu9+CGw{dSi;n ztjHKpq3GA6!;q4&D;HdK^BKDNY>KiL=()PrS<|at{h_jI^KoNmQ6(bbvdaVFA1JuvzY5v1- z(6BjUEj9rHN^!qBsgbqgVbuEix+%Dmt%DeQxrLloA&g2tOa#D`Hom>j#li6lK*%Lt z`{t!OXQrn|fX~eh3wX4+0$@r9aLk+=5N0w7{V?*!L0>128l>UpWj~r5?%o0M`ZV$W zt35e*%o1~%#MDn#9*lu3lWfssrD1Dj<$-zJ1|_&lR))sMSG0|ce02eN%OJP`^y{NY zGg*B=1Xoj2GYD*i2TVOlg>zj20dpW%DFGULEXCFWqP`f2z1(8JL&`I0arslvnLbSV zzC+cgCShf}CtH-Fwyl#u(5Mqd2f$6-y0sX8!nD}ze>V9fYh@6s1vFJ{&Oa7=?P|QY z7^<`-;q9FZOU(TRQy#47BRZl$?`@DwqV-vHGHydZ-8PM28wylI5;~%OMU3zjaV4Y@ z+NfWWiHx08DMGP;O0B1%gH&zor8hN@SH>LZh|Ibc6p%Z-TFfnHiSK1Gh{O-+;ZV1m zMEOrFa3^iM`x;|x7VaU9Ru3>23zZqkUxIP>(>k5jdb%eeY3>QC{C@r-0y3cEWoY;m zQhvIHhW7x83J8%2jP|dWcwYy)Sz9w<_DX`n=N7on0K;A}>9ZpUV774qi2$abcEkwSI;a=yAei| zE3nPIFGyKl2UsW}AyPa!9%VMBtP*d4wgN+p?QoEu&tKVrX%VlfU48+F*^^;lavY21 zM%9GUDNz3enGY_&^QS5=AEUsz({mlSsZRvfM>VL<7_t^06B801G%OtY=%uMe7P7ih z4v2!b1xSGz$!S)B2>sv(=|TEoCecIzreq~h3EPG%NZd^R-UyR-H&$T87k>K&Kd!$F z+yNx-yY4*%8mG81K}TiT6Y!GW?;agF3VWU8zxmpdNZ-vz=ioppFYr`zVqK_CQ*i8o4wB85 zHZ4xFnqtg@=~^JZSOJ=%SdX(yOMX(knH(9)rnu6pAPaN|9B6;Fsk_$_3x^j6=Ax6Yie+yu97JN^S8Pzue%xX6gL!*NdWhnj;Pd=(ZU7RVJqjzi&A35D{alp z{g)`J9pvh8lZ<#_K?muX;cO{uchXR&15b@i^@-=_?*{jrJk}gq{~}W>8xUoKbRt(7 z2cu)eNxpcu(l8#aBZLQWc9mZ52#M2)&+9o#J3ha;L9PBs%po>65&D;sdsU43HJJ?*_`wVD%TP4 zaF%xro-hxx`Wztd;U#9$Zabb!13K~N1Q6Bzlg12o{WM@y#W^F}M4Jl&ZDq~yiFO4D zpgppg8IxN@M3sJG&DqaHK?n+5%>xe~uyr3~*KrKQ&4?DI0P|t}N>x@0x8}+F#sRT} zdH^(xg1GPdeVwgQtxN?WmbU+B&4!-qt-j&imz{A37+?nfuE(KtlMlNYGE32yAZRl^ zD17MA28`iIKm~O+J_cRov_E8T>)jJSfb4O+clfA{3~+`1fv|){d*Rr?c>M0-KC=Zd z;sHMW!3khcyg`KO&+l5jO0sE!d^fKo;!U4|auEX&6kKmdigs#Lao=eauNT-zzMP+} ziLy#8D^%dpAjMSMkE}W*u5Fyo2omT+pG^&p12-V(1#A zlvP-Bv}3v+4&1L!k4=J8QlJr3tFr;p`f$ma3C{w%K%rY&l{CUCkT(=OtAIrg&^?&U zuxO^kBsFN5tG4FRk5+@?k@OZt%?jC+@c4MUzN;R8H+R5B%DbhK+yxkhG3$Cs;sNJ5 z_~kBw{_p-2wgG2@;dMR8%>F-{jT&ADjpHXh>;hnT?%WEG71-qb{l%XkL6g8~xOWEU zkBrlBH4kxP&Mz#)N9oipY5}jct*fGB!$a0=F|4fX zF?61yqUk^rQH$@rKrJLszJU?I6U0Xx=7d(?tB^5bt)_#ugebZoQ9q*e<_9IJdp?Fi znP7zDSbppWD-Uy5S62b%{Z}#8`cGZ>%gelrtdQT!+Io6ks{biT;XcKvPM$8tB6z-f zgF(D`{bO2WDQooqA}D%VT6GIH_5T1v(DLRN|7aygh`WX!Li|(z6bB#*ngGr-*`(T2 z%dvV_fV~XhiR;16aSH}E96fwO2Bzm6Go`?SevSc3N=Dv)QY9SUzFh#gWfhiv1S)lI zH{MEnkSPKZt>9DF2nUppGzWemB-qyLlRdsJI82734SyA#N+(UTjvpEUgfOr)=mMS! z26LglP3*^oL&v96mOwjd{q)p7d2U`WZ5o|U3vf2&k{GW+1*KW?1uh!k{q7P2J87iu zpdi`$ZtNL}cjO6!)?@p){=MR*HAenH_(d9*+tNrWLzE@_M5hcOXm?C#F5Fx$Q0i9m`2(B>I z_UyuhpJe&Zr-d!1DSaQHWg$ze?bkwnB6z~0b0{rl-3a^w0`#fMYGkDPf^$)h<$Uib z2j~c4=0Lb<{*z{C76ce&tN%VQ04YJj?%lg3kXYculOOsKv$wme-w9&hTu=35pMf^J z%F4Ewmzoz{`>oh*OI5yW7^YW00E>$Pj5Mn=zT!0C!c|@p4LAe636c+F^y6&tyyMc= zs(1s%`Dnvv`63qNy*iE=5H$Py5hO5tWp#9#SflHSCme!imX}Qc!TJ|K2zG+&y=q7M zhL=fm%uNLZY@40vfJpTO=8~plqC;A9A}t#Fpvp1*+xjkf2R{526 zKa+bmGKnt`v)$k8Rc+KR-&#G|wB)Hx$%^DWJb+HiG1*X6jsuPx(7_^lj{sOI8zA|; zcC5}W8(i`@hVvU(13OR+PR4v9oTkHu*I3cuI{L_orHUn1+#@?wMcT0NEQLpBzugG` z_KxkAUcVu0w8(l?1NmQ^n3v4DiY3?4o+hgw!mSNN@t<*K>IO%2`LKvz^h!v_mO`2k zS6hxP9q~ebKOE=g9!OIsRnBFJpd4juCn>=E;v_yPpRpl-Ak0re^%qL-#xRfWN9s$a zgOzD(dzeu#Ymp{i6EP56OE8Xe zK(us-fCI5W3=5-P0-P@v5QSv^B|gRf^jZSPIr#!qsCWwiU?4IW+om0n^>RlJYz#CP z@iwhrfvM#&ZKHV$NZxrkSXkE2Cv0v`nv$M@EI0^&^gM}Jx&S=t1_-;GhB37HMMah) z7TdwJ`T6;)*C5t^?+zFoG#jVQX48kCh6MCE%vlM8XZErD&x>g8D;bqgwZHr-3zX5B zCL?OkQL9H--X6(J{?GRLyw^B?GB|_*=vzGdUqS!1928Y5ShA>cCQW>-fd}_q@9owr zNZP;cXHu5u3%r7PwhNik<^fZB_i0!*PamG<*&`PraQyDk7Fp=awLI^S z#?|$g8oT{3wgJV$+W2LNd1i7QTlC8U?fHjzk`&|mx{+@*=GIrHHioB5{nC4Czc1Xs zgA*>+H}rywoRPD)h}Updu1OuR@e*_-1;dxZro$dlvLUQD2Oa{&5DBBUns4=wP3TJ3 zjN>_3>f=8|92BAZMwp$iy4TxMIUL!{^EDA-6Qb04-vpm|Cx|s*xY+WMX1|EA8Pk~J z$Kn{am@Je_3%>p==-bPUi-}^Z>T3H8jDRSpsI`8#9#5)WM+X%!4t92TrKF^SoIxb* zzG7+@lLpZC z$mj{JS(}_2Z~J3a8+LW?=yiyI67OMld?C_)vZI2ABTqXY>QFLRi(xL*Ht~7qe&K9b zyuEU^g+$ZZLn)qPaGhtCTH^ScA@TTx13He|z(i;y(1hD{y^u{edu9G5Xf1f+F;w{a z5t{<1?B>9;aZo1xRp+VQN;U8lRpcIiMX9DicybC=N`zL1SBt#iIHCN%vv~_M?d8#- zq&8RMlbyX(lD?M$z(WYZAPll$y_q_ZsZ{N(KbR}M8T&pj#;j%2^CQ}@-HYc5)m1)1 zu;d2XuQ4@*1lMG-)YhaZAov2*O|aq8y{%6s=1++fRD3w}2Wy9!%T79*tl; zQ(sl74Mha#Ug;UKf~gV^?%1Sw`s6s&`YC~6{3^}@>3d@=|dn8bSS-p$SU%3Ub28*-lM@(!*!A0V`eI~6q_WPkvNW< znnHl5gjN*eCr6gw4o2v03+U-nJVwGx+z@GC7?hAYoqj$W-cDWiKhAw9y|`r5h4+p- zu8Jx^a=Y_zP$YDBwrK=a56Er2NFzUCwGTs|6Cxi7ND4x8?*)FGsk&j^6TEuo!9>Xl ziJ)>3v-a5=ZKWwDy5Dm%h$_E1=SC;&tv#a7Pz(%0Lb(nP(vu@%6v`hKA#BbMk)#Mp zLx;3fkZG0SNK3JmiQlgB)vwKd{Yg=uS@`aqTULp%{KDebQH_~@ngda|>x~FHEbLz8 z<<0Bo&;r_63$>D|D>dU8DS0l&uzX`F=0wP-y zV+)_YGs}5cA*)cQo2vXfs;B8{ZsC2GpDin)!JDQ97O`r6wO&x=4XAVZ^JB){_?WU7 zYtC8J-}gUnq__C7uxovhsruWXOOUtz?5fwEQHWaqWgq`2houbL zb3gHw2awmki_*G@1V0@SfGZXO%sG&O?s$@DN|}^Ce66ZFngXpl3jMS{5Ub%ez2i46 z4hj@g8w*xco58f7f#+fR41jNqb#$iRLSjJZTXQCXNlesbM4dO{yA^L{&ZFhmZzJZ1 z&(*X^(Q^lWd>E;8SD;UX3^=C+9w-F>w;h-fc3E5G?{O|~@8`U~?u&qgn9^km-u@@G z(kcIn!d@>Q*?z2D6nM-hS3twu78-B{nax!a5EeS{?+TD6;a8io1L`#m@VuX7Z%S?O zA1Rl3YEyN2?n0C=!0hhh04(Fj9hVknH|lWd0%YKA2tuy%_$bV%6e>hNd6Y%Nf^n3&_jtI2n#NR^vLj#hNFk$es&|Emoez9X}ucDo9Z0E{>Q8fXCJE~1tCXH z`&<&x=rq*ZoF_w9wG43w0a)@embj#}<=!jl%9=IfnNd})og zTDM`R@_1wHf62nBr*-Yx%Ws}Fb?HP9NI_@<33bYklA^W9@7WK^8xJ8tapS!c>pu#1 zbK|-y$tg2xL@8yzcvfFar9=2fe~Lf$OIk;!RzM~*P`LryCaVOYMksFKYx&-OxcO&U z&0j2tH9#V;K%j+#BL%W!1vNqFFd7hY0ov(RT3+7! zxb!zbI|UY~X8eF_k0`Jgo*EuYo-2L9$QayOCUk&SlBwDc;?IA_LCjBLU1&@|6F1lX z%#1g4Q{6*S|II-WG%Imq{Ok^|dd6oQa7(DcftJ6)+RP4KJId0EK)bO55%h(_F@Iff z^u>~6L@J$i)C&aA%E}#cHZlbvnr@)JZX-*1N$E^G%4wR_TJi0+f_Exsx{7<-5{`-I zlDm3iL&M^4U>{8Z430>e^+!P8z`&eg0nQWvpOSh^z&=q|MP=8_f6-8G1E(6KJ%9UK zY;s}YmLzT?W`j>aLDZ)*uQme@)DVFxMFm3plmnBe*iK-T`R;6Fx9O^&EE)5fD{1@s z2%PW1nPv^nSsU;{!9(hH6QcZYW7IEhqvrpP_!JulM;pYmQ;(drf3}|o4XPG!X{Syt ziUB_yyea6Ezwm=&C9O`+-9)gmM~TZpun+hl8zweHa&+L8eh6Hb8Gv1QB8)KYJLbWB zip!sYA))^9KaenMm!mQoC=)|zT`&qbH)A*Gxg*P)h%2fY`AMZRR}onj5J(INeLa? zmwIV_Y33QWUkjU(q2N@EqR*d^#Pe{7jU`e$T>%w>9ZjTO6Rhn-84>~h7YTXc&dIMU z^-gh~6q5i~%F@^=4~s13{Zp@C7Iu^aH<42yn5`u$Pz#qxRE`V)Q~^shz&E`E0RD>o zn^2J~bJ9Y416Jzzi2nIwfDveJa{gFrPFk|WKl=Fez^Vq$E2j@Qr0X>@LeL)g=)?jL z3R9G9Pd9f=W?o*NZI%sqLGcgQse+?5>KYo{xQRc$BS9+g1{%h3|HkR>hX?<%a*;nW z`>$pVjc4ehEkHP61>iC69-c_84VD9O|A4_c?a_9h^mJ;7oaT2)S`9R~9NTkV&RkG# z!)sdj3YMn27BCOzfTyqI8zF zFGF9z$ito6IEIla2VyH-{l6$iDxuoo_Q;|DpYfI`b<3eAU8+Ttaw;rsx4*D+uyGpO5!TWe^L z!jG1)?3T6SV`;iz6@nZ+Kf`p)zC>B^VkMi?1@b>`geUF$|E2a@b5gh9`Fq&w_CvLF zk+=7l466iVxVfjr)DTx_J~^tkFvY?omBPY`$^WmZI)bZ8gk>Ej0ob(69r2_VB*TZY z|NZZucc{IP4gjahf68F2O^aQ_k)<4Lx^R8okM8kHjg_^3ElCLQDe+%M{X zGnKb>`R|`Mh!l*19&7tK2%DY)4Xh7D1q}f_qvfb|zYstOy}%EL13Edyslr|NBD#>j ztbE=HXo;HJjWFTKHc$4$8)Mfa;Cd}o4$NL0p z;cR4~X&KK?-`*%D{X)#QE%fHl?-e*6K`uSkJ!^XDTz*p{}h=r=*1@X;--6UiV_PGP&$q9kymx{JZMI z!0w$vZ6>$3m;zN_-qoddVlnxpp)wxLXdvBu_7DVc(l^A-oNe6 z?{A~~AGO`> z{ug2TGiFNnEFK@F{8PVmp9cpgt)jhfRJdz*~$9Pp-|48$U1p6#NX**;<3q8oYeMzH(o68yCCrc~MHFvF# zbIWIU56j=*c-iW)Wm(Ls4I+pV?6v1Qk!RhAn@y@k*Zq}_)M1j;-oAx=G!x3!!0n6` zBazeHF{H(Wief0`BA_xdVImi~5>{(ZU}?X|u_T}LlEsiii-{vtbPUTKg-2^~{|dB$ zylWKRu`(*#r-3666I(`FcC(w$>cMih`k#)}1jm@>INNARx{1K~Bz0XWqV-VxyKu59 z>B>n@&^}*QY^N@rN*wLIj2DEj(deakfJ-%VWfK2$zgN{{K$s zg;w&7vlg2PV+X@6XD;r`vUFp^o?9#05weYj!V`;3^>tmg)i2LqXs#sdLB}ysJGIRU z1~DC+{wh8@zO`{rE}XEG(L?nxkP2h=leo#ot~ai$yxDQEo=jY$S;~LKr@GU>>pqO9 zF__W~vDWNP)YqOLoNG|^;V!{0?S+bK#1z1NWe?@d%%$PAJgt-kiliJ_1Rfl2D!BRt zCz1;@+PHTilvG z=t=}naxf8@%PF?{13T8Llxa|kFL8)V;q)2G8?Iem=p71e&}tTpa^5gg~neaFH@7HI(&jDMB0s%U1<>_11pS!?nC z&mtVwKOrdi@sCx2p&o$yz6r7`z zUy35-=DdDUtYl6p4gX8&g;43Nc@RYqiUk96VSenRoBv#_#NzLJ7t8l`#NHQ|-J@>C zYf`Iju*BaDzpomeIw0n}4aZp!fIrzOagX*{86nwWeC$K>^ zf|3#o|EaYz(O0P*sA9Xx46?z5&B91`=4o9hf9pH7K+P|5>Njcx;so6LE*jc4Md-cJFvWqY<8QCM0>>v)exj9O-nGKT2Lr2E3 zw}H)Z@wuCiu=To|;{ESe;Kk)ti*W)IfA!NJ{wuNG)oWzvWJx4vVO`t{^0wKHG6-H@ zA>+JT@BS50SJB@4W!bxlG=4SKAFTDkTC=j$FN6BdeX?2gV1uCCkx9j@aKBD z|8X`Q8f&gTz-v^K-HX!H0*l}u1f3)i3dwPGRlVdI&lX6=Th>+tJv+Q=0?3J0)F7d6 zhW{RP8Sj2$bEWFN5f;dm5n@}@9q)*$VXZ_;&Yz9b_~W_Pw_=<>yDvFh zvlO#Rn?A8ZSIvTQ@KD<5F%J%2y?$OgP_WM=D58?dVa%bA#f!A{Wm7gR?FiR264^9#ZG@OvkB&Eg^{5E3_ zSa{nTg;93Yv?!^0opqQHhcYr--0R$jw;)RgP!5&HNIFPw-KsFLNA~L89#+71So-C1 zs#&I(%oH?E&R`mv2K_#X%wwG_o%Sm;lcNOPi32g)EW+F(pFs~Ywa9pKP-1!+eq5fV z``0j{_u@TvqB;QthKwX#vuJJ+kVLB%R94x`UiZSZEB_$vaenglDrgy`W5cw4jA4?` zolcD&^Qu`rB^DTV^*?=|6Q(?%kyhEJU3I3$sIvN3x>%fNsv= zv)WjFX7e#vPG$(qDfZ$TvCs_-i!Ih(ZeRntXWdY~u(`}PZEEqd0U=sdNR~Og8|yv# z)EuWB@6RKcqAN^NmRdu5HCO?zMSvu4lTvbV&mjZHgDr7Gc{ywgYOrNLrJe+bWlz&e zhnbJdSo*Rin^)#d5=JCv*a;q9>30O{$elS$wGc$*zUHRHNyZKIt*H;P-*O<*ll%#t zMrypQv%@YwLB4ZJ+hkb!4e2>8>Suq+p25;fCk~F9i7j5$N6;DNvEzf)+`Tkp&K?Q1 z$;e0ffh~CXuw|xw{4M3DxnSCVMRp^u3?-vOja_7=Lg6%)G$``Vig&R3qi;U+KJvfU z?7Q|mJvaV1d^R6$VQ&{2$N+aiby7sIK#`JuzP75gKl3})_ivZS#lz`|Y?`s9?oJst>n@lRm2!M33e;)IEzbW8Rjyc4aL)B|IT zycxlaR8p&Fy?DBMlxy6FKT*q!R3ZzOXbCpO|doQF?YG7LRXmzZRTu39{>W?w( zdXiF+FmLI^-((J0_!;M$PNrsPH_s8@&$zEqY^R#(M+KfomWy&chX?jBpG>fZ*^^Fm z$FQL$va!GtnPwMC*X@GCM*l#~(UMR;61PIm7N14q$7-lrD&JDReG{n+`-!`T&-?6e zsMNeBR9TPv{Qmg44!V6mdZPu_Y^QiexvzX~@TV^fyC+4c$U83u3QGc^O=eVOmC{Pg zbTx#*X`!?y32G=e!qSeJZbC;BLwGT%zG`St8FXnFu1;VpZb%6$MmT23SBtb@_Ojpv zt$ggp;F`OJ_e;=hjpEE3-!NiHa571Je4ykFPIR7=REypUIZVGF?Gn3KJbw7IF*BXE zVUv6x|60c_1OY%hdF5;^Tto$!7P%FBlpJv#%B|rh+9qii4wh ze$V^cw`uvBf^3+*vi7;CsG_JR_bXk2Rt97!Wz3LVri5>%1)^>wn67%?`~-~6QV^8L ztX*L@T*lgG?lOXerD{SO7mfs&l(w3IqUNM_(J`;+!~gCf*R=Qw%~AwQK^zeb(}yyg zY9uY^!)CM{0dXu&<0Mp?)`oc_g(}XFo>?oUZ)%r*aqB<ty|A>E(o|@}DiUhy0-&G24rA>0 zsr3nx^xHA9N&>48?A1^H*yFpxFCw-bJ~5y;gmg0|C!$G93%@NkR?2qGS{mY`s_+ju zKX??|<1wqgR5({r75o4h7xHk)b%0d#@VV1;q_Tu?LwJ zUdq`!VMZ*+7;+^^&@V6i!;V}$Qzqf@Q!gbG5|m8Q2DAFTsRbS3NzYq%@!+^hcp4AM z%}33q@532~u>=Ry786Xz$0_)Ogn_H8jp!|IFbJH|5!D?3Lj>D_VI%X}=TUOb&J^*?{8uuYR& z_z*#W8zWUr`O%F;^bAuU`-&FMYTwa7=VGn?qg{^sgZ@t^W|$xi3aiqZDCN;1B-reA z=KK0_u7Jf=iwbrzCmlob?%ZW_-#>zv4B3K#fyZWz`PTP%OAIs|gg)XIN-p78Ol2&@ zqhH&q8d)bYp65I&e$c~385)ve{2ss`@WRBCos2?OZuFIEb{iqz_J2W?oPFcRA5h48 za0^V#c8gC$P$lcJ>3{hRnHS&(VcIscYX@B-p=dJ9k$R=34V-Gc)|Zs0w+uvJJ!Q8W z+8;y_^gYv zs@R2s+{ol~v|M7Lt|a9(3B)iUv7Y))`5TFRC7sE6fh8(X8TJ+o3!Wp#IT(`3f%I4t z=F-KS9RLvX@Ni7~tB&JUD8ChD9M^IOqM(rz{aE?W0$vzGP#`0>*;_plT^{vs zv?1_ooVg?Pz#92(*3+KdSMWeYYzjB6NE1m(CVZsCd`;{w`I;{*K|+@spThWPd7}S~ z-VZVloHQcKDQ#g_=$GaxJ zOSTUUe;*7TMe19Heu(&y9&jElC;u#&4Iq}at$uz?z>zx-(v2U@2EY!ta8*0>yQ0bc+!vo z`Q^>4wSNCk9Zt_&Aio`sWP97^Sh?8be+)^L_CDgx3&EhALRwnrKc#}`7J_IfTe~Zv{9WE`Vzht8EN5K5pVH9jp?0)gJgr=g$Q_HEu2t6jnq)ozW;zuik!DmdNX{) z{ieZWYvzLDDc#2k;lsHqqLuqc+X+sl!L7nto3D-uqerT79aI+iwOg7mt`$+RHHy3b zEr-GgQZ6g?j-tku^q2@L>8$oSmAiHN87_39Xz?R!JB^Osi4w8mDdotEdwkpgHV}73 z`_CT|`gR~Rl>rj@HVB65bK|-rDhdDmWp;@ZH{_!_M=nZ08R33*R;?#DVwdlxH=|~7 zD3+M$8wN%^)qh=Hk+=|kh(F!Q`jH$`Pi=mRS{P)tUj!0wcqGhJZddTe9F z#dgAT<10e+Z-4NdOfa*BBHn~WLF$=))r&QjJSU7myt<8pPUHt)8h4&xfz0?L=S9X1&M@!!;4wkA+pqcF)!nAl%=6 zC^f!rG1Of??YK04(ZTVPP{sPinkW+S9_Pgt(#5c)OgW>NiTNIx8{S-%2pH+ttqTbu>k@b)SxYE>lpV2la zv4)sG;u|vvss~nBE^$yubqOqL=zc)7+*BHPakP4U9LL3pM2loJ)15TMDXnQw^y6)5 zH?IpR#X$%M5ANT2+bd@X-5zZp(;c67aAb*j;v8}pw>dft`!Dau>knkEu%a4c3MO}~ z*~!#?Kf?>Nt&zD%sF&3MYgL6HPiaqB&|_t-41{|vu!Zy0S}^_xw5zl4`;_==k;3Hb zRWOFFz&;FrW7&L(L+NA_`7BgA+BkG{IND6&I;_7r+$Bv8kI$?HA%Q<3nvJ#&Wyc&Y z01-tUobP%J^`P!dG6;QZBh8JKlTD4tR%6z<3Ls5wLLy@4dd2DWRjy-rDMA9CG2K;0 zp{ob>tFNGc1gvIc4bbU`KEW&u5<+9sx36R%1A&%SJf1@?i%r&OZ8v<)Z|n(S>Ot#$ zGqUtvbfTJ+uqtDcs{KGTuHzKf%LLmJT-wE;d`$TvUnBoLO8ytE81V;DmUETL4Op=j zAHHCak|EvsH{_$?;FM^tTPh&O;^US5ZkOnq@8fE=l;NyGK9hs+A%8}JJflHcNFMN& z8l{IchtZ_&z&e{sko|;70y?g>+}w+6i$&we%nu_gDN%8)DAm|dUWiZc!q5xpHL4K>`FpUIfxq@}qqoYtDepQfjxUmBg2?t~3Vy>Zjo zY(z@8M_%NZc5kL;gr&Rmwi{jI&c`U<72XedMW`g6AuZQ|ttXGIIvZJz;GY-HVu(4C zM=Uj4T{vqRl&>DLvyV*o_boylvyGf72hkCYO5V(Kp++<))q5{j1(ULk8I7oiv>bhdJB{`ox4 zuP1MJZxX~7aepVFPYu1N#^W}I>UycPR8`m=k$ulQ@|mA9l7o3*Rzj*i42Z)XM7VW( z5Oss{sk1e8FZ_*Da|bs^Hzapg>>90udC;YuMhqGdzD;dQU7|{n$uJ9V{l|JfYrx`! z8(Q}9vkK3TXrA(0yg&Az4laV5IVt&2OUh_NJIqW70vDX9Nbm#KH6Q^?iy=WAz5lUH z%V0M2l4#^>VN*d6cwfn{c6O(ue8csp8sv!#Mh*@P{1K@z-xWOmGm3@$W%D!DF>bS4 z?r(*l<`k?VK5o(dW4#YCmn(0`<*QipyF!O8EpDaY=~nFhm^UetV#K?=`8%t!!P3Z) zZ;9M|knoMT$_h~=*@E6utR5x4Xl&k>OhilB!8~VHff&j)7a~wtpp2|r*W59q-0QHC za59>ASrBWZK}GXq#ZqPR))dlTML^BXiPzE41`vb7wu$1f$T%4hnv(=-QF+%S1A7Sx zvyMWzaD&x|xaIThMI06on$#pA;fJ&}s}6U5?^u?DaNm&I6t&u526cpJgoWiF?ACxR z!%Pr1Y99BsHoeStD>(xv{#A zdNMk+K_nR7U`qsoW+qH558cdCE1zp4-#SI6gpec!(f%XDrZ$`rA+ve*r|tT+BLSHT zt*vV)Ka7l!E>+SN0Y=%Z5Q&T{J(0|!aYqT=k}ip`p^fMJqM6e(AjH3iP=(%6h)v|G z-UH87%U4C%smSKwht@=g-1Ja=MNH59LMbP7vc)~Vg}hhYie!w6LL9Ju3s{ZmrY&3Z z`qOf^3i#ea!II2yqgYE8=JU+;o3U@e=f;E`_6nu=HqjzOm6aq9v~)uMmN8$pnAX$4uN5OkVEts5b|j1KN&hx@6X&G8Q|M}g z2Gubj2ct*{1tYG8{$=mPjM6A_`F===F7z4{jrlU%`q9g<;-Yuqs}F3%hCv%Azw?7= zUH=SJO@mZ12hXXqQ6~kEb9=yT3uZnG+cb{(LFkoskZ{a`7FYv{>H*gV#=0R90fh)W z)oM2Oc{GKe%L~Q5`xC=VX)E&bOvPm zY^>VZhFd;*F{V`(s4q9H7)mas4&pu&Yrfe<6e5rNg|0Gjg(f>IvEGGICa zjR_gUX^xG(BlyX?&&KSED8BQ+dh8fTqZAUDL=aYA+51r$z+Y(}+ZLj=vj73~?^zE* zB``^U^#Rtl)`3%o5}A{rsc)`a&2c)sB7)Zay^BBfoqPWJ+izWe_4JBp_uyz6f)eNy zxS)h#!?1$Z^r3=pQNU^Ae-?+3WCB5-j$}56SjQmxb~OUIJfJGxFG&($TE9i_*iCTV zV=rhI089tIke-=YTXvmKksh_3<6*&rBv}UM971qd zrtu$l-!fcSf+J&CsGPX~4GT}gjx{Th?(YImkAT`HM6d`>xC~a^0?c19A9tRfEs(N9%AFPjpjcW?YIu(ghbe zY_z9A=rVlNL903)SDv>5Qx;4?BAv(VCCdS(AT!p3NLe+eo^(F+U<5Q3D>%t}r+SG1 zTsR=y0eM-*BQI}>q7abaAa4Vm@)St*eh|I|{jLhS>{6`eD$Jw_$QC5VkO|kLmy}|A zVh9=`@aZ~yfe>_E$6t1g;Nz83ap`q8VK|;f`>uB6hZArd2MXbDJg+Aq0O5FjEh*ro z(@_%ip?Nrtoum8Va)GQP;0TT}8o-EL1c|%&cN66(ys)D!Jh3~4$67G~FhO9sK-zQx zDuGEda*lv&2~^4yf7zc#*stT;%Ss^&8{LT%nzMfF$*BlS97!DXnPUXVIv#@s!oVaM zSqHE=;8)2+A^>^KyO+Z@vWV8t0ti9xuIIsQ<^kJRVGW!BSbI8#YGSEeIb`|i~H;f%aHq6LNm?jc}KqQQK z*1(qSTQGQ_+cObW-DUBDGk5VY%wnRTVt>N0!MIqt6fvKcGRITE8o zsHmBSsk0ZOVcrRdmR2E~io#5u&d{Q4leKQ#uQu<3b}293ntOL1RWe zQ9Xl~fjL=&B~!1SqwClZ+y%JjhxW!F)&+r+5D%8Hr8vgSBNywSj6vlt@@-9cK0XR0;y`f}aO{FxAp^7@Tc?gEwtRoGrF*W=^!jRgf=8`O0WU;+{m$ApP`Ro4An29esCpp*gGK?sKf zOve9Z^PT`$ip;pg=$jj13E}yAO|L*tbI;sszVMfa{`%ebURGZkY9CGIF=#lb56DzwZC(y1b*$!TbO84c46PX-Z}68@4wyuyRTn+-L#5mb1GvX>u?-M zxv2Lse0Z9U0fXa*`%-`)pt6jXy-nCOJc3jv2lxXAf!kzo)jRev*skYh_c~+?27|uQ z8Fi)a_o>no&Kp#7<+vQW%&>TB1tOs!1Q*Aw3kmTG`@UXTfydkNcDx;L$J^_)_gDs? z1VADhNU#JVIRKF<)C3jqNSap)u=1w8(Q(BrfUJ1ahYZHE3+qeK)i$u`6W{yi?Z5o; zHSeBTRn!tolqP~dX=7s3e;u{J1A*f8)JN&xTFH2~)}t^{KFo{P9_Tyd7`H+wpe19h>GB zs$a`0NVFOxTm>HQ0n9Amm>&E8G7MlR0W4>KU0LLzmPp{E$(*6QE}^Ysy^9L~Wf8RP z>pAhW-@WJVUwrHOD`u8Qx&}s5pp3!f0>h@j+v~&V?e4{o)^|fK3W3r?(+tx9v(x$C zqOXuGD7|jkf~gtxrSJ7A(&KMb=86y?W7s%tN);-?KIAOtnAVPZwHl+uyJQANC?tBg zll%A(9Iw7~^hrvjv|$nkcJFoNplU39L!(OPvQ*e(Q8(WfAr_buYR3%Xd8T_n&;=(z?=cci%_~w6M6P9gbo} z#ggTARSkr zIG}?Oie%2h8#VJ$q7*sHsZ7PQS7iv5I3?!fI;sK!5@TGJsLi>cw(Uy%@b#Gkh~_M( zNwuAaY}*kgfod7ndySk)4MJ`gLLBB8Yug^UE|;a(#1xbg0@HEPAJ3pDpdGbl+adQP zGdY(vt~T>#H5mDg%xKQ$^oYRC<$&e5a5+Ga0%A0u0w-rJOr>%cS+?_pVY|C+hr@JT zIGlq}0o!(G=MC$ejHYy%mh-Ib^4yU&MAzjI0#IcJ%jJiGRz@kZhCMf#H%`wQ_Va$t z*=rxA3W8;O#d7>U6|s2sFap_jU08;_JfAgA%9_?)S;L7j3K*7Ggw{|bpOrPQHvQI! zVLMM4*5Q@mM4>bg=f^kNSG&nF!_a67W20&KN(k`s`nVRr+l3I!a$H*oL0(u7z=U9~ z5cUvg!trXAgAjsvD)09xENNQKqj}TGzSKFI5&}(@a2#VDW7I9+*=0}}q;d{OHV%;) zfygBRJO9!EOO+`c$HmgQ^*|N9Jy@AT2WZ#U+6K&gRITE0c zhILShp*xmANMZ>4ltVT!#wb#m{1v-f`@Uls_D^a`!k;&fkT@c^Kro1UbtFV-&%#f7VcA=k27nWPefA|9mcM zrjG=@o_;8_Zt`^K+g-& zeLMp*UW)!xXU|Hca|d4ROI(-3uPK;aTYTK7?)3xo0)* z3|#C30ng@5Fh+@O*rUjqjwMTcVr~)wjHPkim8YUTl|@%34~xGxAwq|9g#9X}ltu8^ zmR3YUzL#9^smoz;#CR%S{M@#-kIikUyrZ@(G;CPT5rK9z>@TF~i^HaBMZ}L)jooMO zZ|*wWa30#{F zhh^EOku#AsY#62u#t00{0b>M`?NBpsI;LS6dCQ@OWgh{&6J+uh#xe$~ii5}ZyjK%o z~uzaD>od>e-L_W(sNqpAsk3ClGjMgHvN=PdY@B1!4IWh?a1x`BcN#6DR5QEP3-rZ-kJEdYa>P5MN4Fa7+OwAzrqvl>vNF zP+t*L#rNU>ixkojvxW`7rhet5Wix6v@9lagWEm6Yqi<%Q#d!f_d9@3#|JvW~{q5J@ zdEKna=)M$#~V5R)Wr<1U`Dj3Vdlag=8}4S?#>|gy0Ys35EQX-ZFTVnrls@A z&d#9^@jM7r*$aVDa*V@Z#~Nf2ptcm<`+FDvzwh1q*I#_~n(LM}RJ3y8?PZE0A(=Kl zw{=VFkIbA!5YUcoe=rKfQec*2|L|*!Wq58V0eE(G2LC5}8$!VCJF7ZxUZdD@6`(XQK%lE$(M(G2Lh@BpDG`s zN7E#Rk*tB8T_c6F6@kMAEQe$1^eU{}d;mSMG(vuDqMJSUYLJP)Ph!F-C1B!^H57~y zOe>FKU*|AVITJx$J>*#gK!gwwf=ra*5}vy*AiQTf(hQIoMc#H0(%wQk*<;vj*Ts~w z2uiFD?ot2ab1j;E_$;yS!PHZHZ~mS2P_9PsDnw=FY?wWbX{FsSsL72RTStp z4I8e);1t5+S<}Y57R`jQtqt9o*C*p#9HqJkJsRDX&s*7W*mv{A=Pmy9{Fznll4%3k zJdntGdJ!&;&4xa{njI_fFut)@6k-4V-en*A?mhqPA4}JlhJ27^hD_G@{MOAaKg#D# z0>66f!PQ6#Fl>DLi&uT<-RCX-Z9JKKSt8@(?e%Y>P&`#rWDpRzT*v@mbIx4OiRM$l z7(HY`A77k@5?K$Z9ZqKewhN^=2-k989wR1`5Fn8?u(Y89i|WfTn$Ev8s1p$20F4CD z*fzMLr6+c}D8x%R1h@w;U^yMzgB9Uc?20X*m z$ut)sNaqYNi9*w4^p0jg2tn4gk)L#BZ3kmH6PDvnWN&!_dk!X1^bf_+-ZKJKkzTSN zEZc!kkq`;!p5|)OX*}dp@N{D*+J}+|>gxaL$Uq2SIUG~UBT!{_ykPrlcsR-!7CwFX z3W)KniuJGkKgitLm2@e8-Bj&N^fMw`SCrubx>~+8+)3ZCPe`O;VH&<5LM>Sl%E%Rvh3s zO;8p_+n%n)H-7UU_jDz*a~Q=<+cxh1Q9fr9_|#(?GL;xGmIiFw{^l32y!oByF1({} zI0-I}7m|2GkfRgeN-AiJjy&8o?NE>7M0|{){ z-`{ZGs-5pEo>h}O<@7oIvJkK>dm?5xZr@N<7DY*M2>;sFhW^nM%A)~90ve(L4Pn0q zgL}-vk-(@B9+|BuUU=rkvh`e7AfTxz3Hv9&)eApMW(?gU2{^U`>Hn~XxvoHQP=Coy z`*?eG=ButqIA!s)SG>;avV_5S7CYJoK?o4kWT+B@GU-xf$+P}o9{am;dn?)p;|S=g z7e;1pO>^UsLT~nNjipUKeUBeeZ zAs&l!ta_3Vpt=OxcXgc9G#pvwm&+v*)Ho^$G)ADuq4dgmt7{yQ%)frJp`@)jCu zN)ZYAFqB9mlQ+@SJ%aa~w-96LJO}|CM<6+5zi0%S3jtYTC@zm+WGHde>25kMN2n@?YWl;%qRX*;8^cpvp3xxd|Za8-_ z)<3@&C=R{sXoUdaQ)LV#ve?-=h)C2A_JV^j=Uzr&*r%bfYY54liLg(7%WLW=^>pB| zWES=15$xL22?z)Z0VSY`bU^cJ1inG~NqV`H+q4{5wgU*!Xj)DqKNcZES3sf!3#U~) z8ujaUZ{OX1A^e&rMn4uEEQBYRDGtIIN!1vt3UUFj;LVys0U_isrXd1n-lxIHqLgvHekR*na7f-{w zo$a8MBA_X1*suB-qhlyALa&4{8E4jHiLtO>3;8uU1HdNa=w=y|5)7wvIAcx?#?pCY z3>)$hPu~JekUT+0fZ2w5Zo&KKkr~6ON@nlY6x6#Sz^iY@%~cdln`&M5ke+1 zGd=AaMaZZ6gSsLpqq)g_^1?l=0CwfDU-M~-lpO!uqn+=whK*=Y!#gfH5f47K6Yy)V zXx{5GLp*O{gu4jg&~TA$JE$xU!mlgH8Wwa#@^p+K5~akM7)vj;H&g1d!!DP&5Dulp zV|EICr7IGAsyv|+3}}j47~e_3Md3SM-dH3PYYIU?SArp*DkMfT?os+t;LzMSZ!A%O z5Gnvp3J%MDP0>O=Rgoo@;s6whK`My(YpRM<1A}qfwH&AszacXU$2LF;X1)M{&AF#t zophf<0FuNI@~Ht`m5Cy=^yFvwj{;b)TO-~gmN)I>+-Vip*^YC2pra# zB#-o-G(|#j$cI=e3&tq85YrjR%}Lw2;H$Si9l7O!jncl(;Y@MV|BTA$FZ7_kj}T;D z=^W<5V^lOnLf&+|@kJ>(7nf1j{lu^D-#F`E>zbAJu3<-!rG2(x|AkO;KPALc!afZ5 z#6SrYo-@Ck$s4E3jDFd1#b(R#HYQHJc{lDXFL}=UWtn95hqfvkv^4Tna4|Z0^WH z$9C>ws{BtvNP6-RAAfE_2yBO68Xr!6B`>j`w&%?IGQbR#lFxMaj9hT}ckfZ-@eE1Z zZf|*Y(S0uGe+H0Xl!^ioxP)$PnS0nkXs3*E0474IZqWoa|%Ylf$WB#=AFO>Mzk=R%cs=`Whqv;>m9NO=m-gW)I zHtv_hvhbH-Vg(E)Jw7)MsZ+g`(*LHr-Wa-(XRUQ~$lO>74atJ$`mu7KPZ6EHqwzV_B~NgH--D92$$dcyIj9dNWL|nK^XWI%A1kRdva#XLh!KH4@N@vdQfCf+1gEG?Sl|%o^C+Hh7B`^2Kb^ z3QDSCCVc95hf>+6FIqGW^QwyRm~#M(QQ|u8MSe}Xe%;oV74Q1qJsOo5THA+mp^&eg z+s?yWh=(a9J>zS^Yq_1iA)G`#kY&Z^Os)6;A>_8*jh&Z56JGl4u@ZP6Yg8jqU?d4* zy8OFexZ;EFI)BM+!|{xF3V#!q$Z%W%({^CK!9Be^hj0PECKvKF#48+b;^;ur;RHT4 zW6SL7@BQwH{|*_}^xE2zL|fL0uO_TN8oxs^BnaKq&*KBgtt z!cew22Nm9FF=^Vtj*g+9J@=2bAM}-kzA;7V&#L}J zDsMt?KvO-zsw`3Pf|nO1p!ctB`UnC#&N!jrRz;Oj9`(!I9hb%f5+leP7GjAMTp^H7 zvGy*y;v&Y!ZT1&K0r$1|`T4q0YUReA2-EeGyS42;bWl}FLqKG=@Dl`ET3 z88UO`Ww+h>)Md(ox-ZxJ^prdy3LR$}DP~j`!?Yb}stiWRRZp+p^QUaijFeXuS>4?u zUEQgkyuZG*B;7yu(Nzy_df$?|(hmrUMP5k(al>*@9`U0z?1y1Gg>bVJ?(Q4?-P-n{ zYeQijF<11CbPgq1S=d*^`2~OZ)5;6VXI8B|b;ax(WnCV)c=-&3RM~ode_wRRsvYO7 zpIdt!Riw>%!-nIyC=UDJQ)HxarZ?sSKvyhz?t#7CHxN}uO?l+`l92CjmT5y`6#b)V z?2l(WOL71{pNf&b*tPEZ=4I0Cnypllh03TD&lo4J+uHJ*&X)egb+fB679hR5w;V_V zAi>&_fF{f5{Oh4j=ato!er{Sr<);-{dMaFUhO~a?jNT&01`VaJ-QbFjm z3>e+g-1D!HCi%fd&(19^IZ_hxMP#<3dDV^;cO-MyFZl4qm)I^JRDEh)&#sPt?(7>o zDcn$jxNUWAUEiFh<&hAv?RP!2a{Ie#r&j#6t}OIvMoHYT`5}DXP&|VL^<}u`(i3s_ z!<&Fe;6(tI;HK#aN(gkH3{{umzQ_*Fxd0=;yxLMsukzCTB}ST7J>N8Y-Ky=EhHHxG zXRkc@^NEackcspdANWJQ(B6&vznf_8Jz?o}r)>%cwK#D&`upSX`P68ledr2{kjU=t z*ppkfwS7<+_UU?2FxA;JGK>QjkJObGwYLqtYu9tT-*x6?C;c3(^7D*Q*B!6ZJ9#UT zB*YWh53js`{r@PYQ(97AmTK!58uGH2i)xyhy1&reHS`&)uH@V0Qv%;{I7dY!fK%$r z@%LvM5!4k>N-BC=`meO}=5WLODNA?k>Hft?EO|;@b_l#6QhzJoRkkwVYo%2ZEbWnF@03~4`R87$a4)p%+ zk&SC_sHiJ-^k`sY_m1`yxM2S3B2AL$+1q!tU)0>(`=i;jYyP=pdgT`+Mn+uz+U=)r z7^`;91x(wH&7M|%10e3)y}R=Q5CDq&=JV%b9=KwbWB>Q(ul&sQ7c9ALU^ESv3y?Rl zqFt3G@;7|NNKx)-~_l-hp?XwZvDl7 zx@X-d+M9YV2x#&@PB>%Um1iw$7;Wzy5fI`Y7WIGPk?n1lUwz>TU#~9-rSqnPpf2Od z?d{myI)IQ*fvU)8YVE(+6&x5#!^q^971fmdEpJ#*WeMHGaSZf~LQ_1JF%|6Sm zC$@dMtFh}{`%U|gOQx2;y&~*yRAmX#u{7cU0)#+FEF~!t`i2u%CWaFKRTl9dxcbs% zUt72Nzymvb$8h5%OIa}FyYikp*Zl92+R{ErB4dy5Xbp6<^xru)7(a=WNA9`u!X>v3 z_r#uh;NJD_^0~F@^vdXE>$bOlyM24xdjmej2S%^;tBNx@DOCudIOIb#?0fNSLLrc$ zL=j;v1KWk_Q(jgnBgPoAhK1gdBxY0>!zW9_mz=fW1HWkQdHUJ=Hhl2hr44tVIkS38 z?`R4VWe}XBFP_2XJzXCi+R}Q$ybBg>m^Hofe{v3YsNh}=VgiThN@BQwEOOt!Hs6*V zii@dBr~m3>S1kYWA8vo9t7Tt5-go}uup&wC{r%l*zPb8=jh|sbJu$t$^jn#%2|~OO zEaiYAGmK@7w>|dA=HG!6apCo6{9!?T=@0*W+tY1>qbXc{=KSh(-n!|Z4{iREXy5xk z?D}GpDbkNrRYFu#5CTDv5HLcrvc!_EEC*WJ2Uq6e8R@Ju=6>npm#_HcCw_c?uA-s{ zAGmngys!W6@t@78EoqovSNi1Rz;|7s7>4tpuQ+g8xS{fs1ADvf6ON+@NvCPUvM*US z1B<6sV1Mr@>FgN%^`__c-r%b)+I8KfCw?L1*Pi|FUp(x;(9^oJ&n6M&haWDP>QkvIffh8p=XG_*Dsa zJl}ld$iBYIgEb{P)A8(iiHtEC4e13<5`^ozt2rgBSyj<5MQ`jAdv~<|(7$BbmA2&^ z0)i(edye|b>AOMWWgxGNFoP90mtR2 zFAHOLbMO0*H?d-N&96sNIYaX+pybHjrjy*CML~&o6W7)yCRLj;g05d&lC$Cj*^`CO(ewrbm^11C$RAuvMRapl0tv#Svf z=l~`10}pThc2E0YIcC*-J7+uJ;NxT1yN_hnux_n7amLoc%`Hz4we**i&8o)B2~Kd% z5%KHrsWL_q8AuXEN8i||x)1cfZSE7tf8+Psf zXLg>YOANlL6=?2`U4Gv3+21LtEs4pLL6aF$ISW2bhQt_>+5Ggz)`5ld7Eak(CQEB$ z$t?0YGwloNTR#4&Q#Trp`-NCC2SN_1$Y~A5GaEkk_7xk3PoEe2-uLePcvI`(=dOMK zIXC)M39(cTd%9!r=>$|_oB$ZfWfL$$^dgPhE1+3BT(fNqp3>9M9;40E`fGa4db_2QFW}dR0mIndeq+ zziQ3$S)cse6(|2}oG}`2b!A}`2Q|QX5rD-ZvI3=Zr&lg^6S+jzcBH~`O-z6V1#CL$ zg*&cGLq63AXvz=;oUCD?Ycz$TNB|X;(KYA4W5o|v{o%>4-udX39~S%6b5syfRpCb} zYvSjRY?=G?gB!k7HnlAOws$Q5Qe9a%ofyktq<0LWpl2fz704TKDHUZ)8g8`x+8tyZ zAQB*(vy#UK?PGs^_JN*f8ox2ReCEF-*FDf1OCf7J2r>=a z1C!hw9QN525$nsJyzGL}WOh?Jd$5#hHfQcFuPJ`}AHQ^!G(48gBr^uUs0j$+nhql6 z5gU$+fjwQ8;2hDAj*j6Ze)aGcaNw*bpWE|+$c(D?`7^4{&F0O~@VI7=*@ds&#_9Qt z8Ls{HFJAf4>&{(tTi;01qwL?rgpQ{<@+=Jaad7o=&?o^RSa#BkA7mNZ-!P>d=D2gT z@SMj_o?VTG>XN-hy88X^|JQ9lF#F<{$~7fV!En$RABE)%qqZy*cy@dHN1;jh(!0;P zejuJ1J!y6g*6!^DI0q#ZrNtqfx@an(N?+Wxe*cAQpKrdRyt3%DqJZ|iJ!x^Ggurs$ zmp26!89O_NF$chcnbkjUTEGAD-Mc&Ad+My3Uq^gu%H;y8=4D*!GDGuF@}#Ei?U$f5 zJje;TdtXls%NEw*m1fxxN?;on%)E&M>3sCT=bJu`pq^=HsQmVquULWqx$`;XJxv$J zawg83Q;S$xI9qb!jL&|!sb{0>9>jB;bIh$P#r&ydSkv4)fBS~!i)SsKcHorL=YP*B z2>sncXBeh~1v4s9Q_pwj>&w3T%bz~@Ghx~<%XWrR3d?a2OJv7g<+VFj?fASF@~7W- z;R)~SkEM8RSrl!9V+DOE!R)E!xcS1Rh=hGN-zNBJJ9f5z;J$UuKdO=r%n%{;Tc zZ0*+P_b%PAt?k0f%IFruu%PG)qQyZlM!+e9GnQFC)G|kTp;@y=v{uqF{bBV_?9v+fH9N?ez1PHn89PYcm#3 zEr+0(VD3Tz9YIaTGdtQav%d8EN_qIkw!yIrpW4wGW(>)`SPHr#Pnccfxb}$G#T7=B~XG>Pn`L)*;U1x{@FeNcUt8k(}26&7)$4&$_y;1 z138m|5GsU#k;yA1Q_Er44)XnRIJSdLyV_xL0ZPav2>GyNM)mJyiH_ElML<{q(wa7u zf+=x4W56`5&P>jPPm#euj%%jL<7kNtV0nr<=*qzxcz zif?@O@{fJ!l4XDH9ZrH#`j!ZnQ9_`r5?uFqXz-=RiIdDK;p(DHv?B6|%NQ2UtpzO@ zfJ1PEG#T$aZ7v9<=p2qejgaoF-`8`&^Nt+}NK)cM%cetDBy4CMSlYR*b;+qG&wldi zGv+l9ji&MATUTOJ-zX5$(J>gu-H&X>)Y;Xz;?&vsL?U~8&%WO8#D|iXDTF*fxwao6 z1h&gPZPH5tA63G>)!PY8gnF5wxpR1Kf5%|WoC}sbTO0B`-6MF%1xs+##Y@N9`bYnG+wUI#+VcrD|RB8(5)R!V_yX5!JH(dpnLkanQ zQR`Ek{hIudb-UWHIsfF@_X;kcNDNiQp+X`O$kSU|u4F- zLRBSq@%%dcZRHM#bPn(-03o>Zku9jJDMm79p?fG9^Hmn5;)YeUaz|^aOJh zZc%O`i!)ZtT7S(M^EQqpayWBNEuP=BA8ujuUwis* zrxXXB{=qmNcw{riGA0lWU~g+bluRC1UveT!BEII5*)`Ag#xoax{*NoqO=XP-CTkxR znV~n90(9l*CF2MoaJbdBzb^qs0ZPotk;cNLD5P&v0mD?3@*;;YMkt{$EgKoz#p&7% z1cN#VC5h#y&As`+hJEW=n!0}inLYV@Q%~QzJ>BoxyT197MOUoY^1h3g{!n#X`1}%D zx`q!4*K@%sbQK)r@l-qmU(Q7TND7j~0EZ)_D>!x0R77+Y3#M28^DagHz{ptg!qb*D z{FHFva+f0<)bZHr#%owf7&n}~@K;r}#dvyaEAD)33r0-~&=frWTqBAqBB-b?LRRp* z{7V}?^Tdw!_g{71qVG?cT9M8g7Iw4^BB060TaFs7D$ZVi_JaEe0nS=D1=Ym?Og^{( zKu}k3&+0v}vW8b|+j7P=pTf!*D61`j2>FnTXE4||>H%NQgL2r9S+zwyE*BV0<*}n< z0FVgEXI5kXKpbU7L0o_4d}K{$B9Y^@ZqgfhugRNMV*a$sYZ>s@-Fv$)g-`ViIp1i2 zL}Ff8FmF5m^SO82{GN+X_{;EE+B^Qd1uz34fL~RPgR7TE_kqZgWMs{er&c${xXWQ# z4$fRO6%n5TNDP15){3XPMj$hak#t^=Ddkq1Wlt4DiBL&JByq;fDue3gO)M$whv;?J5R%zi>KOEe*Nd$SM9uO-Sc}taQ>pH_cR3b^uB_NdSn0S zjCD`#yizR*<)_q^-YyA&`nqD+{|2?MFp7P{NsJj5hK3R+!LYGxX3e^bmNfAFy`#AF z#2HX*2mkYjCvc!^7~lHK({LOPCP}=^r>$>xoJAmnj_;@KgK=;Gv4Qwp7V^XPDSMyW z-Hx2;Kv5;smWI(n1O{Vi{Oysga9kIh(&1^f#f`Dy#EO@5&xYlowlsu`md}8~B;5Jz z?xiG_#%DhNjz@O34dDB~e;m0~&a;ovWW&vT}|A{_DE zGMcwg@7LGY%&+U*d7$^yxwEV5@}|>1r?v#kXVrLFggLYL$=#h-1!h$BoI1a5a9K@h zdh6Pz_O`yU%dYZi{lJZ1-JlQAv|+d zAqX@DY18g`U|q8_n#@9xC4@8ua%mX5Z3jbbgD@-$lu|17C(hF%em-E>d-ts0hmN*> zAa8q#QGOMfcou8BW7yj_hX48SMfk)e%O3jXPanLvX8Fu%@4Dh-jHYvkyod5g0DpL5 z8=ha^41|1#FJPuE&zxG`7F|$(;l@2(W+6l6$dLy^1WcKggndp?K#zMF#~Mb)GLZ8& zW>yv>oj38G!w-}IFRW_BIR#F~mgW%2I`^Cd(9Zn+FJq$zxfW*+%GlH(xe$a1mp6?x^=v@)?AY3hEqi+|STMcvuKv+9T6@O; z0z}Hf7)oZLDKd)u8vePa5hXz#@vMazRZ&n%Uo-!)H#ETFT)?pG_}qr78v)$Ddr#LT z@F||~{f)w870TaG+jhS8*>`;MgO@J*%fM(Fmc!pNn1N9Wi80`K@sF1g9u!~!9cE9A zwjAhJAOzrY{Czk9EoZ^MqyeLT4gIkszy+kBPNaxm2nbh=_=F0AU$5Q+RgrTe^n9Ts|GTf_NgEif0ViE=MMBqP!>wCQI1Z)PsD^ z^R{A)f;(=EMgtIzON0<`To+;S3+Y&Zaib1(u(nvAMb=OAU;7)j?nuO$IBGm=<9 zYfFum-k6(g>XzYGDMI=v$PT&WBUMW6%-I;v=P!{%2IbnJw2FKEq=qI4A zG>oEv?v>y}TohilCqfB=ij1%#`8rhvFGnwgc00Jbx+o;Jpcl6HS)fx2>4j z9?%qU&f#)_MfI0pL;E1&jsv&AIL|IG8y@SA$M@}MFDsv3>CZbHcW!TkB(X&)MJh90 zcirc2d05ZHQXGC2C<-35Eb?i9EaCCz_KN0ht#*QtZeJvTEiL^s+K1wMI)~yDVO~XH zh{v+@Zx3uzKwuR%aX@&CsHVy&4d{6PPyU5nd%HYyS8))iFiKp)2yBPLuSt0C=_hz0 zeF7-5^w`(ChQG0Gd)ti_Azw#vN%+r^kUj!H2$wqnT@{glhD6rDNFs}@VHZT2#~G}b zkfR9X4J$ThdgYBE%YjxXEKFsIWE>Y%qFj-fFl`5q z@9PDVB_xLuHAIuq)iL-r-MW2x!jg4b4G-)XuJq_E!}Jh~Q#EWljn^ zq2_XQ$1^W(=2!4tcw$Qn;#m`sfI4u_ne+d2S98zze|zuxkMx`|_o+|6eYt3lXZ_Ew z-g7;R1hL}8nRm>qjAAI2L)vk@!t<{*3{44gSrduTERi96YH0)=!-=sQfBvtDk~pd& z;fyoqBWGA3MZviUux(ee9XA+MC2l)zek_p%01S;~P+k$i zDN7sRx*WVT2m*p&P`Auja(Ihnzx47@C>Xw_e+-V}!sk=apURh8s*GRXz2>(NB8O=3 z$nQ*%07Bi7WG)KV)uMjYPjU|O)IjUd7-m&OpV_V}H#hciDK@Qvd30x$_ zDxZvH3}`aLoZ3=o1(Qp|j_r6US)|Fr^P+&N102~sPxXbDGeLY~RTwPWi961Vt zDG2^GdrDaprtO7!GPaG5?%~4XF)`*8GiwOTu=Si}{~VeU2cz;~yQvU>PZQlk3HKX+ zUp)=Fg0{iRZO_EohEF;9oQ3z@aPFe-=M5YE194D7 zu&*x$$KfxuMj?cNYqI3%iUh~AGeI<}lRk$t}gi-wLBNs>a4aM=@ z`!}E@?Dv}j#E56+BawRoA)hxW4;gO)P-R%A!w+;OQ_z%iq@oZK86)U&fo$FaV~13_ zCkUu?;#CO%E=R{u9NSv@@$`mfa7pqGchbb6n*|6EcHBh90A$;Nn>CTl8i)jSxLiPC zti56J)K4c(>z2o!+V!ofnN{D62K1H481~>$VnkEqk)3S=y?vvpJta|pOHoMgeXTvP z-V^}Kni7~t3-!ymfZ*bgxpBxY00D;poB)Cn%1s;LXdqHN#cvV< zi5{(#kC&Fmv#I>X*>&aHKJvC@j>PC8spvjMM*DCApSfo(6p6hA+99~((XA*e4xrfZ zp|&z|N72->&-AqPUYR;+`UzQqZF@V1F6nO_JYmWS4Uagsy=}k868+org8(oHkdZ)S zhwDB?g04vE(a|)(Jm+XLZ-N1+C=S6bmz3IJ39#f|_M1OZN<3uI)yb8sb5_bwbK6Hjb=V%xTD zb7I@Jt%+^hn4EB8+qS;*zQ6m`t$T0(aq9HyRl93)} zfw`21C>IZgs?34h|(#Mxu;6J}jny~l$p9j~tBI)G!$cLu+kupE>X6AqQu!o2ehpUO2YgNz?cuLOlf*$6r)>|fP7|KtrbbJhP* zsfd*@4eA-~{|=|I<+3kE`B5@K?lD~u86g0 zxg(>b)=^c&DQT8Dz!$ZRL<&*Nm8_O7fj4vqk4{Nxh`bAWlzw2wWRRZCHG35*w zub^cL%B}hQS=IqqI6})C;b?;8*9*2<5B&@vN#&?$V}fC#cK!QK94N}$Pfk151m>U@ z*L`Tnm?uPIBg^O&nIk5l{Aw(fsDJlD3%f&qrjo#7_hJSGR>(|z(`v?28)^1ekC{}} z$d<(9RX0A4| z(bHn4>;4b+67}+-CPV~`!u zs*%FsOyPAZ84%VJ0}wOu@x~C3GxW7WiWGNFhzBvJn_RYrQyLjVGJ-DOJAtt65Uhy> z+W}WD+65?E=w;n@7z_HWphVN(dmu`954)?Q^gh=b@n2+YDH);Vgz>yR=OT}(V$bxo z)T^dk^e~{MY2pc!xDGiYJ}5uPcZBp>gge2y7|XE9%O5LXRAd=7h4Qn0OfEtkk8@pR zoVGhagzq~|5-(b=d=EEAov5{5cJiwgCX=5wgVY-bY)BPU#7$XLN!RkC>>P@L4l8qU zvO_JdoPKznIC+xYt25c7j3nJ!rd7Qb!3{TzBddq-U-=gZ!+sFR3 zFYlIia0KL)=E3pqzWXb>6;21JB97x+0b%V+;al#v^XpJ!-CoZ25n` zSNoTIsu@2a}IZHQ4M#Y!4H%eGbnVr76}f;*%8UVeffCyL}=8DnZ&jeNg=3|_7U ze%oqg;RJTNjRwc>DOzW;eyV}#MiR>?2x16&0naCUFL&4Ot_qWrPjgA7^+4SN%$cbU54r>paftlsVL(0FjUfbae1D4#-a*1=R0#O3| zosd9;{hvlCDq_Q!{)P?aEEZy^n0N~*=@>!tVP!1bzZr<=V1Y#efP0r@auu=NrQ3~Ta;DPck+89OE7s~!CIE3jcv3|(x%8`@Z^+6ud!Mgxxw zn5f^_=4XTwQxW{c0Rx#a;J@GcYxBIZ!k5whaCg}B#g78m$<)KgTnTAJZ?Ylq@zBBD zX@{X^#;NpuxdkEx;tMa*YwG4j4iZa3$6)lwsocDAi7{MGrJ3Fz?X9|++{H}lqqX+ zh+egxXt=3H$|43%IaV*9K2xvf2p^N-eJua0`;5ci-*BI>>UZZ(OkRUakTM8fc%~vM z2t5%3IkPr5r9yp!pPcx)B~EcBFWM*((au7OVH}*CL!iR`$z9u9~j%KuPGty#jFpk6K}%D zoC^pGi-M_)4t_b#>cPU27gEBK9TVfXKNL)uI)Il9aWO@JOWO~kW~T2j{UTMUTk`~b z0xrJZG-tYXz_j%dM(&5UyTAS-)Q=80Y}F^hm1*?Cfw^BqCD_t=l3^5k(G*uMMZIQ$&x!33pI=yV8r+%E9jGtbj7!TP$Rbq zS%oIra1C)!OGK~9${_Xug%*!^IF$-LhUvll4h3D-9^ux{?~Mg=A?<#fJtUd_qpK)rdUoCy-V#h-}p{SZVy`YE=$9NPuC z6CuseK1r=&V$6DI<-ttppubn1EQ8^)OmU3yRN@c~k;5Yk)`OWcU!MyebC^;x(86$kyb>BCCB23MBh{sIZB^F*FgpEHVnOsx`#Wb? zt@ZT9u4IwlzUCZX4u4On)Kl%ssV29YPW#pJJpfwYEq@A0n!F5FQn+$|_PKq7<30sC2Ub?XkZFOvavU=rgUux%$r_Jq&-jg_w6eS9`ArRF zFBQ(EoW8hTY#c3BJz6oBs){M$Jq0SGyuCV{=@$M1!Nj}4ilA1JE__oR-pedq*&=v> zx7j+CDFrH3K^Z~VJi7=dVf%CjO*SU9tszlXNf=jPlY?GD4zq_2!=Obfi3|2~HFcy{ zm~rD3(@Q97Am4^+>-I%GzIy?@t|4WR=h3F~lp>85LXuk;InxHZsm;c**^N(mol0Zt zYX|G`Sl!@FExcXUybM zFf!PuoCbgzy8c3+Cf*tx`fUvr?n2!5*Enm-Ebr6F=KN3z#HlC`aer<$@_wU1Ht#iC z$&48J`&g_C#wkUeH3In((Ukf2LHc<8B^J{Xvt`1QI#jUl4SgjFVB`{WhWH&^wb2Dv zV@YAK2XJqAdMctI#+QAKqY`7{ESLOkD4DIyd(Rpi^;27iRhzu~*r$CXufAYO84 zdXkE4R0#*ckTvnKns}5$O8n=KlYr80s&?Z5LjpIjLI~;w@qca>%QD1>uBFp`P&V~f%{U?!R-fiJeJeN z@1%^V+#Jlr-3iofq1tkqTrC97-&jhj)VDcfMUjwe3Z9Px2dwvXHJ+KCbC&dP6L)*~ zZ{04;Uq_3^m$mHE6%5cS=r^*k&Otb(i)sA?^1`JM#C>6wg2Cr^=}$Q*AQz-HxIu$% zZ?15}|qV8GaiY#sezMRtHtBVaI?+l5CHydJ`a6YO^2m%64PHHP5}<6Mynd z5lAK{Djn+kdi}-kHdHe8#mJf!wh!Bl{Px12MKwv6_NF;y` zUj#^4L3}Z@dcP<^$bRDMde89(YJ&`w&D4EQ5aw;fiK+Zbi1M^LOB!bEeRy#ZQ)2DV zPA#GDqj2_|FPgvtC4NAEZFQXaPsYCA0W8=ATTxo^Xn{S?b*6|A5s7l<4juZs8QzA` zg3AF9vvr7g;@fYVDy9fHI22ZcBF`&x^f=k?zxn=ps>yIwKNtL%5F8d}wg3S|0J2bC zwsrCcCS-66n4I*Fzj~?33hD{`cxz(V!ZL4t^WuNkHcPV0n;Sk?+y$VV~@mvl#7eKF)CV)cy8<`dEMzXksr1tXODf=<9qaim?XdRQ8um?9fAp z2aHn9Xs$UNXIbFZ;bKYYx4X#8dC+0*a

lkuiHVKO86g#IvBwM${^bj2mb-iv`vP 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

2$KY$*2L{SO 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

k<+J2EA2R5rCzh#9wH>p{7RN4pNk2)+)l!$_TP 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 diff --git a/doc/pdf/Fast RTPS - Latency Test.odt b/doc/pdf/Fast RTPS - Latency Test.odt deleted file mode 100644 index b8de45281e66bb96e0d46d419f4ae4323780a2ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153509 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

x>Kz{{FG7IVj~~GjuvDtl?zMZ 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 L05C28d_n#{My91u diff --git a/doc/pdf/Fast RTPS - Throughput Test.odt b/doc/pdf/Fast RTPS - Throughput Test.odt deleted file mode 100644 index 0a1585ea441eab0ae4a958543ba0aefcb05338d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148247 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


ZV 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 diff --git a/doc/proposals/shared-memory-transport/sony/PubSub_overview.png b/doc/proposals/shared-memory-transport/sony/PubSub_overview.png deleted file mode 100755 index cfc2da4d0186bd476a2154ea9d9c6223317c1e6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48256 zcma&N2RPgB_cv~|rL{*(?NzjPOAy4Si`b)9QALSSy9jEpgwj@Pq()I{6KWR`rKO4r zv15x}f*Akk=kxnMzyI}np67b5tF9(_-{ai(x$kpc=XK6I-aucM?h3~hGBPr{dv~>r z$jGR8NS_y|FOiXvb67e+NMFc(jC3`~%KN!iNM9~EtLv$gkyXKIj_og!zF+pbYw1Hq z#>RC1N8T&Et4c=JeD$7|x=Enz`Uzd-4fCMFcxHQToLdOfod#@ct6E=%mvq4QaP+|o ze0b}#GhZ)Axi^(>ri}lcBv;DG3txXGl{Z;&)AeA4@iN~Z3)&?`lRFOU2=-mOTO_1) z+2p9qXSL0w&B*jqe`<+|(d#H_3ZXRlY2`zY&?Tkm-tR2|i&O82&7NH>NRKY|Aau=`4QtdbuNZW5hiDt!dHcWA|GHVIxP2 zZ_-=rFv36kxje7~3~vzOuHud~e#fs*oI3#0tgv#G90>Mx{mAj7-o6()gXEeb%|CxQ za3BDFc%y#KQF-0!AT3!VnUwU(kagI9Kh7t+5?iiE2UdyNtkfi=}#Qr#Iu?Vh1@S97yaN*zZM(oq(V}hTU?3N zeX7#qNQAjvJw)>enbA)1-E>gSVn^sAc5}k~x@Wyq>p@U{Wt_5ybV9Ex-9Bh>jE#_h zJq|%PO(`86_q;ZT#NnzSl}oL=V>L*LikvusCJJt5gn7uaAZN!Q|2mX&CWbCfW6+N@ zrhNuoJ#k_&6#n==vFl{@;d0tZRUW}h(d9h;!We6TrPZ zj_RkHt0^fh@}tvx?Jk^Lpp!uVfmEN_7I?#Y`@1}P2v0a6CcTI!3NJ@ybvDcb2FWE% z2mP^TdWsvoT-7EeulCTniqOrBnmwHZ=@L{a_F`Yu24P-I{p6RhZ6M2H*EoK+JI($P zCj(YFA>>0i(P`S4KT+~mIsjb?9=kPH=2hqEuiF?~VRp}F$qV**vbUYbQmwbOJ7fp6 z4au7vr;i6PS?V}!Cf~S^y{3$gp?B52W-V0DA2QeBK2cYX;NYe#y;uqPsyF*h-1A_4 z9aRLL7VZhV%l*o48!i>(y)&ie?lKg9d@txoJTTkHsLEB8b~fnZ4zEM(clk6z%ulP?lkkJfGCb92rg`x10T6A=96C%O z$kS-_%I5&{*cSO27mx5fpWCVyR=ojtdkPl-U7_thdc*v#H#0lZw6#_~iS`53EUw@+ zLEI$0uBI4Fwz%GZ2Gzm`^%^s1m=c7aQDr?EqqkfrrwH~GHylUKC>E}!Kz;SUp7(yo zs|rz=luPG)R6zf&vA9tlVn1M<17&>n+%qJ2tJ<4sf65}S7V_06iG%!&U49g#{k#{J z;;>ZHV^OMpx_(x9VTCHUe3Pz{(EXBl?V~4Uj-#=lg>1|)f9^6zW8uH&6O+KrOr-6U zKdbryCME|ELv;{2FM{azFF#S0*vAYz+bPXEEfh&eMR-l~A=oO$9KvMCsuAte0a=`g zhS3L3L7i(B7m(G_S_&MrU0}o;;_(xpSQk^z#vR%YDLOUxiGzLRF3;hCGRfYd(Qie& z#OCt)1?hhOyFF(PWL<&b!SkCk9q$-eZ9DV$-pc(JLO;x-TUrT<&8q)t*|{Udyqcn7 z>`P~3ob!S)p||a>vKw}1d_~m3kliRYJ^Hh`$*H!(tkm;jZf5L6J=Uh{brEk=phP0I zt%;Q6bK;c!S*z1k)W!QWf=cb;91X~w+iX7bV_p%zI+hD<7(7bWa#@h37dDiEcst29 z!muL>HQBKH=i`FYJsQ#BZCIppCqP#^FADsm|)&!b)m$8dM`}yGZv$r## zc0?v$R@n1jfJ4Pg`NhY4@GFFEw3PoeR0qrC!&BRB^cM1ZzUcZ%F8$+-vw8na@v_g8 zho3b!L{`STY{^a)droI*Ix4482t4Cd1Nqi$mh(C=1Q^6^*syRUHQ72_bJHo7>q5

    77V2VkxHHoYh;_;AeXN3~`@rC(3Z&0DI6hoj8^ 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

    &13%Xr&n`LG~w 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 diff --git a/doc/proposals/shared-memory-transport/sony/RPC_overview.png b/doc/proposals/shared-memory-transport/sony/RPC_overview.png deleted file mode 100755 index d25009c43daee91af4b9e5478aa0bf16cda0b466..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108738 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

    1AcmtonXpWC@!M2$H}(6$bu8p~ zlTdjHC8YbvTrjGIw3eiQgU+W3Me9MVbg5aWZSp%VMhzU+=m_=|A^U4(`u6+8%sn-3 z2S8t7y;;;lFW~=)>C8&&Cn}(tG9j|(yYtF7RYX&b-hY-7x=amoTty|7yWp-WFm z_Q$X^RUb*Frp&et=jh_3YsRvr zQt1$${d2?KF-YfEWe~vk!cNq$PV7pPo!jqVakxtV=F7-#Wxy>>1;MH2-B6v~Ao7_J zyge8r-+7c1a#h^?Kla^U3>tYqJ3qBTQ+w}D7Sh(G&H(NiDUx?tzysGsDpxD26a6@L z^XlvYCl>S%y6CKb&DifW=`XgLe7HFb`G*9N-HuN~>>-*%Jo>kbB9n^$bcUzd5pheV z79NCKn?S#U=0U5P>MMu7{9iPq2wJPkO|4X3tjTYj%r=roao;SMf79Y|_t&j_ky^sc z)YtJ3JWDa}4%Yk+j}CDCfC~n4OrD{a(Xd@~23w70Umn>%wy-zVWf}7TFtEl8nOvb= z=1aAYBkW)i99~p%G1%wc7R#-`MLF1}ZrIBd?y>6yAe^hJ+ubO)4LfK88Rl~ed>DB^ z@g9u_KMg)n54(9YPFQl>i`v{~p@Kode=bb#v%86GD-7m>c>eMFp5P$$;!$ zV}M&UBHq^$#HOfB4~ebZ%Mk$PpJo|lwNf8UE##s47gKn!=*QMed!`Q$_8yMKhoKcK-sp4}eo*q3joMl4Z_ zCS2U;DF^_rk7&HRc(luP2ar}xbVXx&$^ARMey<~3Dkul^yz?^aKD^Nb8Jm|j5<&}B& z&vT0R#Nml;;U!Jw5wl z8{Ujz-_rimPQ0aEgB!*RCFGL-RQvT1-oNmJn{7&ecHM)BWnvU20_f-R?5x0Fgr5By zuNCvDOqYSo;mxi11>oWXfERQL>n)|5_E?NvcTgCqHjx&cZUg#%D2Gb{)Q40KxoMk_ z2eV`&nxjtOfl}4ZK&2mJvNuqB^2{xoeAaSql=m65IF)RerSNCpMtLh}i}PT}%r4o! zx5o4)WcGf_JShtJYYQtg)0vZ>+wV415N5^-%ru4$TSp?`C)yEe^Yw0b zvSaUN>zL&~9f5xRllm4Hq<8@`g7`y$Kt8XwR=^5Rpxj`w-8Im>=wAj@@}p`CoW%pl zsC?w1b@v6s%yQKe5FHHKEvx^4z;IYGnuTz^5a{jEviAcy48PEK)@IG;Te6m7NQen#VUBC#B1-<&juh(MCI4i zZnVw=xvw7uaE_rAhfNwPhWZz5ZR2ClpVK0cM)JN*j6O)+!zSje8@9R- z0f{wJQm#jA9e2_AT|LkVx;H)mFHEStzb;*CFTVWqcGqCeoj)fjixTu-BL;kX<>lS> z&RyN@)F_~}DFz4KtgwMU_z(L6Rwb!p{qF(%(?hz#pMO{j znW3Y-&;t%LrmGE$mKhp2YdGLwE2>nFlu~O0;QzvPZ_Ptx#Khx%^`*rMQ+K%lwj=!3 z$+PUZz|&s8&cDSSg89`><10Me5)5e(rW)TzhCQbJE;4isRE3T_+zZA`RH8@?7+!S^i4AeO&)MaV30n3;6%SS#`$UTu=d~f zcWQ97Jp`%9OrP#-CXZ-@;gHl&Xg$`NF`4oarL8qK)DOj3q#<2zs~t9bK7+f-?$z9( ziX|;hQH=ONx`kc)m`6bC{ovt&Gqat!loca>%Jw1D^&m3MDF z2JeocQ+YtmAye)JE|)F+*JFic^z<=g=Ly^um`biwB>TKTHM-4$p~`ER#3Zzq=3^Fw zp>KQVE%Ms*&tJ#zE4xAXCTun){IH9m&3q>}Kp8;4u2n9YSUX zKYRqYJ061!KvKB{#`y00>_%Cewp?qhg!k8X>+vwMsSoUzQZdiYGGyz4?*QU;5<<~u6MVYN}VjATw((!GZLPgi< z)i7%!@w{FcOU6W49~&9#j3WUM6>$CoON6{%BzAsw6z~WEx(-z=#rI2W({gv>N}c9v z;R`k^V)LwJ()Ob!%9Bev5;=}n8F50p1p3AJMGD+8pw$7dbna37uA8Mx^8CsB6bQpX z=>3mufUPp#vA|XMasbIekzy<6a?M#?Ev!}J z#=VN{IMb0o_QGPp$8KRfj^-OPS7{Au10-l*>oIP6M0H7cbRqmziehF%`gN=#E}9}~ z-ica^%~H}P#p{;0s4P07{6jOX2(n_2udM$(?+jHcvg-L(3?2=v7tP^%x!k3Mt|T%@ zdp@cKE-|u?5ZXah2E36T?oOiJ_=egr+YG z0I2WDz$=enR(N$P7Ne}#bDz2FDl%3O#c{d6g-kJw8zy{KQE`V%)kp;})(9B7H264S zqV`*Nz^Mij2YUl}ni1sW7I0lasRV_?Nlpd`MBHdjs1M9Gb`ENJ-SN#WC>T5)8o1W9 z|DYK0g^+o{>^>K4d1jB$mP+3e&oZ$ZG}sK;?Phr7E!pWDS9hk~FQ1iU67F0)$gssK zgU;*^48YXGe~~~;5c(Am{vE(Ci-GI*N0MwYUf@*H(=WAAKv13d$nI29CezYm8h4Nm z-y_bShbLm^dm2c)!qe{n0%&7=-@{>Y)BN6DAYK78dl`Z}-iZAwe!zYJP2u?mAbv&+ zRyA_yz`Hge4WUr=U5;n7LHp{H8#W-yGt}Qd>7ch*wV^C@vS^)ea4$~6RP{g-aTq)5 zxA+pMe-i!HFQv&T9TIV(qr)}%(8)qFbO&HbzXvWHsq(Ts zbau)^d{afS(Cy>QHPYzl?iINuxhe0+;Omn3N({2aw&BAV`=hi~I}^jE29d%BkQD{) z$ntl*2>~s%Z*7OVYceu&<%?Tp%u#SW!dbhJ0WO+AjI^_*XGIwP=b!*E3DBaIy)LEM zEhtFFWwDx9;rE9F2P_`%1XfK=dCa;g0&DwgwV_k0rsP`Sp8GW~zh!qdAJ-hx_&b65 zpZg?61W7NTcFQlBG`L?b6}nIImASC`WLYeM%$z;-Cl!z;zrWpowwRjv{AdkCeCpn( zf)qqG*xBX)3InK%UrB%>$4MBx|IxSWdX$d`g@7;VUROD(tS+FdBiZ2~p?jkUQwaM* z#_55*U9x7>YB%<3gzSE2*Z|kZat-fy`XA09>Gk(?9Tlhb5M;UJbSM4=1@RVb0R0oJ zC&-2b97Q%xDFd3KV2@4|PYGEt2BfS$!}y@UYQ{7Mfw>^8f;7*`k$ zcrL?RHy^IN+FQ_RlU}scPv^u~dSo!%d9Bp{y+m#wYliXObbJEO=<%J)LOxeuXPp=j zu6VOP?dnJ;ZrrePS8p&7omX}#cSKX=>C3;&J&fWRX`s?VmQu_X{3%RM-aAR?je1Fy|G1)QrspS|w${IXPv9gNy^q zJ@yAmZ@H%GeD~Ls(?@5b8jFiqjFWFRteu>=Y4k;P0R`VL)}4`gGDEu{^XeN`5n7wd za7nfDsXD9cxn^@6-#!^`xC0Y9sH23^)_gg#;DW6B*MYM|78c!Kvfb(sT4W(_#|Otd zFH1+Zbq@#?a)!F_61%hs+^nHi6-ek3e%6S6ufGVbkroTNtOag+EeUkGn!@zJC?1X5 z%do&!B2*YG_ZvnQ-h4(zpJkY4Yo*GgFCDLMd$@7Qf_w1s`q!^jG&wRB5~UvNJql4U z7ZvzAfFCTkRTxFDkgJGNy+&Vg^8~@2)`qhBqF|B;6!}`DqPmRsO`%?%`KKx)8!Q*H z3#uNaYcFm7usjOTEtco)1_<%Ri--%DA>rEM4}dt)czC zv@jTef9M~?U*NOABsdDadcThT3F8%A6pZ1~%9FLqDk{TnxAKQC4Q1l)(1iMets5}63jeVzPZx)1pd4}N|e7^-q;?30Pfr~Xy>Jr zOIimy%<-TuJ&W;Z@L5#!dt5+W3Tmmx~m;oR4`Rp z8zN$%p(IdqG@s*FtQOrJ*bM{R`}uPcH588+-0FCk4I;re)3kl)T#Cmtm4SYpH+Ms4 zfI7)yLb8QKlgJ_);&US)49p`ee@EH*IzEITrb-+ME$Me888!HmVv#dN(#A5o+H}1| zh`cJYXCs#+VTeunw;lbPOQ#TA%rJ-9R_BK?dp{Y)=4d>yoL;{^twKc2Gfe>8EE01o zO}%N1p+`a+-vv}#m2k<#Yx@G1zfIkJ5bh|c8aU~Bp@lR<%jpqP35&x2JiiTPPJiq_ z`Pi*4Vw(K51%wXd@XyuBWet~hPf!kE!t3KDrR-d-ZHN4w);g5{-8EH|vPO^M$mK}< z3}y9|A4$AZzyfdreJZ{V;omrrEm|#doc)t=8d_Pv1x1G`B3E56}Y&in!vs`y+u?bp6X3n2XzXIhD?36Y@8cKHzp_rF=Yex zGd&Y$J1G|wXX#0;q~>>4ijHtedD_{sp>x#}({4Xf4ou-Rc?xxc;k5G?3`*Fpym7oE zJ_raCzK#k-Y>8ff@UWvF=(5sw zMU1hsh1)CT<^sAr`*--p&T6FDlY!BND}cdWzX?#rBy}dngAMmw8(1ejd+!`MukO+p zDw^G|VsuI~%M;Fp0*$tRntyQ8mwBBM;hcxyf!Oe=O~hi4^h2yd6<7xSc$YD+I~d0% zU{z3xc`L%_*Dgb!#%@YdHET%I(GoWRTkGB#c#}$|=e!!{IQdK}9wQrG^bq%o*M-FfYWK}bx0|~$Kywz%W+@+P$#?hi zhCKq@Ub_cPDv1knI*)hLMk1I ztLxR*{m!3f7YZ}x1f6dlNmgMkT)6HS`nl0LHK}x3>9`!gg zSh??13S7P7)Vb0F6b(G|Ty8ogPA?jVPX;tOfD?uK&SiCDL^{)r`?y0aS*~AV5DJgu zVdyxg_|1(Aa@4$}?TOb?UmmNgsgf1X#=^+CrKqbFk#AwpQjv#=gGp-KuMoiZRuLb$-YUn#4`eIAx;`%VHm~OSv)$n8;?E((y4!1l?5W{=F{h_*RRPVu)Uj#4$qoq z`(?r$j1^3$7b|EGOoNbA*FJ=I=tW?g-WlA!FrU3BI^t>{x8Dnw5YDPL*rg}vOslD+ zmP!Ewy#fq0l3APWgKW_Dv14u{FQQ>IdQEzbLCoEhN%qh}Y+7A2-P_h^JVdyIE{xuN z5hCl9E)Q=CsF&TO9EUDXhr)Oz&yG!(!cOG#CL^6M%ErJLb0{TU`T2nCw74SO3@GfZ zbz`;P`sK3Mcd0EK5W3uzzf`_9F`LQKaTR#GHs3RK-t*oXjI^F9O%9$zXx3oPkn4;; zkKYL1(o655bN768MlqefFS<}N1iMA6IpUYXjar{5Z_bAGb2QB>C<5Di>RzcQQ1n~+ z0-JUugK?AlbXHy;lzaJ|v&4oPUh^b9V(QF)74`nF#{Kigy<@UcIXH6-U;2)!+YgGm z6BMPuxO6RvhC*f<_EzD~OS`=Kw=Y&pUgJyi){p>a((;K`-!>^@Svg;y?Y*6(L5~3D z@8*+Jd4Kqeza66}v~WU3{VJxNd_4~DyCwCg#BrFJ9T%|4{+FKIsFG zDaxK$XUMruXk){(8&pXSt!uqveh^$^dtCoEZ5zhUWG>{KQ?7Zqf`AOOpRixttMJAZ zS^+#&-)GC8ZaGt-@a_=nMy8O zWNSU;M~YJ49w{QUtzMK1awwu{#L^&&>gntm#@O=Qh}-_!be^q^<$L+3a}ZNrd`d1w z4xW}xAsTe#Nf-MgEAMykj`K^#^i}zsOT48wZQGeCIgn)WR^-+xpyJCaY%ZOX_ca^Q z^LB{J1EyDOt+ItwOoA|;B56SyhI*&hcB8M3g35(hrx=nNsuJOey#cIp(x$Y@#~CNa zVkkwlEp~@>lghlbi}an8@yb+a)I=6$YJ!-=^cK5*4Gh%1VbWs@OfU>(0uUVf@>QjD zCtJ0l+THIz7Q!xvvpJG|xmU(m*Htj4^MS%Lx)Zj!npGDr! zn%x}2$2If1#Jz?+cm`VN6oAVrBCTyAkhFxICze}JY`}QmQDX5yEwUtd8=9hUQC0is z&8I*ZTNsJ&%WEI1%QM|4JOb`dIJl_%V$QZZes_C8!jgFBWyE=vUGjCYO48kg-od=2 zeHv%|NKPw(t_uuc_Vx=xmY-$MgUQ!oL^*gZ^xupTdFD4bIC95NuT61&SRv{tx3JLT z4rO1p^{Py1bn0^EZi^bKbP+n2l+akb`f43$s9|}L?kJq2&1H{VJlh4@U+dhj1O)=u zNEFxYF9qJ9NdW0&NR5W4l!g3Is&JdX8T6KtOhDYPy3gH!ec#>lhMZo#cI?HZ;x~k? zCbxKi`*q{*qgsRSdUUjDb3PJHOn<5p2b55IKQJPSF6xbhyeX_55V6F?4n^i!5IO0k{OC zH`dmqM9?yc?K}C^KBJppX|#?-h8dHBS;>R~q%C|#SFno93k1V;q285t*?^caai-pz z$AX0fLbJ$sz1d}4k4Vc*iv?~XF79P>C+r=RSr1%b7+Gz0X8T2pfE7kktj$~Q`+!VY zsdUghQxobx(L4rH-4nDmFq1^!dJpI=CK1*Kk!^AnJM-X;uX*xaK*3U2zKOkSLMoqM zNZiD{QF~*#|KtmY_A;O>o@+knv02}M_sS7f%x7Mp)k3h0?Ifnge(1=(vWc;>hS#EP z{nkl3vXMGwFOhzJ!s_=5K{$p zU^)Gu`ky0DwUuamd@UmVgn;GP`-c{C=n$_<-a@$*Y>9KO$ZTu?nPqLb{pBccjJmv{r9Ps zdGj*BGSY$RuxENGXgsrg5myzJA|KG+lTC1ctpHmq zOW!CD)Sem^hagErpghr$8Ae>4u67BVxv(HndH?wsyA?<#rNLY?5@@Uq7K_%=_tuG* z$uIH(ZP#2T)@Vx#APQGSp}<5}J;AM^fW&>t*lqAe?^|F`bS=ZzcMOzF33Fm0Iztps z3lu(!;j*yOr(IqPj#{AZyojjuOwR<0^n2KFGQ5brk1Xfeq2IM9#nroYrtE}9(T@i zk(!Z_hfb@UpNhLG&kTPk<`sfSf>k~r2(R#qu#d;d{!xh9%De}+gO&u;q~|erg%=zA zC^$tXch_*dLn9KvSQ^MBmF;G|dTuq;q5Tz0rC z4%K;)``HjkK^LA>^6n6~<{!7j+~h|}YT0Kr$cCTJ8g}rG-1;*o;CvwHJEGikH_rd! zRcPIIYVUvjd)ty9b4XPwUjC3iUM;1*aAA#$l@+-bQ)YoZ_9Fq@e^SJ(>|5r2xjNc!vXyXR&ZE$En z>yK7FB@;sWo%Pq5DRW9QV!altRTQ5%-OTq4U0&4{LxsO-8yf%;&$ah0FJ2auFPUd4 z#GLFlR87K#nGKZIPc^2csr&j!01^?I4aWL|9`Wvz%Lyp?nf0Es@w~w5QQpA9yo||C|kj(;`iZF^*l$SDi$=Ot?wBzyIFl1Mp z-yi!%FH^CMZ|+~CTOP5LyFp1Rff3bC(={wJoZAq2UO;$NExi_3M-)xWloz2bxx28>$A>m$|@lZX?WC zr5)3x2s2dKEv7-%V6$uu zW_Xx?+|!wRm6g&~a&s#u)Pm7zkI-jl^`)%1ca|aKICna^S@D9&bE^GlQ_^u#)=5V_5_#5#=+&C@cAGDrJ|AN#KA<` zg%L$t(JGvMkMgu$3_Ex-!W}DH zon1Mv1WMNWvN+Ih+_1eJ&nO!3&p+oO-Q^W1@|^s~nt@7o?j7O*$BCPd{`{}gY$HAh zdt_{mf!rP!0s1RoB?G0`zC&>+K$&Me2sE&VB9~NqkcP+FO0*$R%5*%?=ukpmSGqG@ zD~&Cbma#__@ZGg_?*tBNx&j}_Z0B-xLFTc&WU*af1TZ{OSzu5Zy&Rn3FX#i<|JOfY zlA(I`a(L+{xgxj}APOX*YLHz-!3xL*Fwvg;`?|c{&9hY8K_0X^A<_YM;@3?CRTEc! z_}j9ye9wWh>i@F(Z~tx1|6@QWz@=5|`&Ih#yWd2q9iS<8l2HBkI2ix3)qnrkeu&7y z{gD39ncq~(-!^KJ>RO4R9((^~@Xg(;>SGy1t$5(pq}#=~mkhNF?;!e;976w45UlSE z2S8-51IGeb4!p4iy9bObDC;px2bhz8Sv4VBOgYo0J3!k6-Rk3+}dT5?eTKZ;kC%Y2oGZeF~a z=>6m}X?(z6h#CyLbN9~SV@8j0)@jotJ7nys&Iz&AUp(+XWQM_;ml-{}z-&tSe-JPR zZwXIZU-YyTgbL`<8(fZ@o$bjxro2M;SJOpVUuk7Ghivz}x`P2Z^yFDEge}Z6`z$dl z1x+6Q-|`;5++^o1O8ZRye~2{MV}z+y1z}*pe68O}o#in0;sp1LLvRC-QV6Br`)K@4 zL?{5ggAav`Tc~wN;FPlGei!JL_}>o=_(GDnT0C3_bwj0*;lIyyM}z%u-IOG{c$1TV zJlJs4POUT?((uWjme$p1`|>`E3j#KaPwOju4n!@0WWid<6Fd$a&I^qeA2~@8s=?v`YM| zQjJD{)>KP~WcKyXowf3pp3iqwpMX;5;%iKu4LtD}!%MPXcd)B?)!f<+@1MgxM&ObiSnJdj!DAQ0LZ zFI$Xz6bpH=a1qR^?|Bx#9V?{k`^-E!E93sAn`*G)qoW7x#^BoeK}owqP%bpk$i0$_ zm(yNx{EJ}4B-fL&lfl29@a5n|Ser0cA4d#-G_@TB!~}@$;e)UJKHJL4o68x{T-KI< zl1#W5bpQSY3ObJ1NrWm_bzZd7Z4AdwETf!B4K|8R61Jomq!xxePm~b|9+I4#IaCUe%)c0H8CRuj(x$Oat~ z-nUe2hVM^PmPrnkcHan+rR(f#J`6(twS^`zP|oaN1?&5`1+l%ID?s);wa6(m;wOBF z6UUUrl>d3igU6HIN&BF7XTIb$4zPLEbI3N`%ppV`Kh3OggDHz^iple4yfKWa*&my; zn90+HF-gHDk8P;Fy~6;ZLLv?HFLdrF6GlMUibQu1yHLif#Or;jC>qno6}6yZAxydl zi0ncUikYWpvTGFFi5Eo#YCTCF$x(XJZp@18BMm5PPxJq|s;K~M^pATTP-Qx3q)5p5 zjIgNT)^UGOQWRMuQEnBVZ{O)F%AkLSJ)uxP-Igc6WH^<6e(!iY$*1cm^$8 z6hNL>^AJ6n=XpReCd56gtBKzA;~lD97*XPVqi4PgN);gE^owofmP>hD0p&kMTQE9i zdLKupR14*i!F-9KaZ*Y@eieI*1D1oEBq`()Ez|pCa$dEVVfEozs+#5Q5HzN61;_QM zC{;F>dU|AeXAF@=H8~CjC|j4}YvnSpYIm}OmC3J#5Ed$ZesF%y@?K4YP&R)TX26Fj z`DjpO9E!C*|NVOKFs%a8&p3waM*OIjuezPLZyRZhh0P(ju7hjAmur5hpacM*F?w@T z1xcs(A@LVxd1r;j9bOG7k9q$vt)@OF(uh`J!>xt=^1L0z$+hNC>B)8HlhazNK0uM>jmlzen1rMk!HOXKyjpn6~Zi{`2m z72#AnXG@WtoSyvyVunnL6N9L30KSs38!#h}SvW7KssV_V>F^|+sg=94@Uxwi_n^ZA zB*mV1N5If3GTSw6Y`4sR@a&*`{$g>J-H(JyMgje1^~yeE#ok52dCs-pK?R5Q*+d&# zJ5b-|2U)^@y9glt2vyAPhy`RD(?@t7&O`caj@C`Q)wq=n^24ytcOEklbL!QmExWr6 zm0a(P5xTB852%E3^l%$Qhuc}XOvJf9y%}7sOGne{gMcmXcxiSsNetuwuqp~FWjzIz zMMJhamSo7Ua$_TOb}!10Q8PqEX2g1k%erq|by;sWE3ye)hT2KmEHZm9RW=a6D{ORp z@)9z%Pl?e=7wz0?uSNSnrZ~Cvrh2 z6BmC0w{spQ6CbUw!R+N-7d>&`a_;ndT>;G}R{P4XPgYA)V+t`vqriY)vqY!%f0AbA zP3z6jHoio)O-f7)!`EfQeR69a;p;FKZYoY?d3v>5d8n!<~Dfta=skTklZBq579 zdARHuP8%IpBOny#;D21Y1i1j$>92;{n{35llJg(Zmp;b~KjX>R&#yj<=&C+G9y*+U z=5CR;Q9$3t>LftTlj|I_U&$;=BZEwr`kk;z`B?H*yjIuufD1@Un z(elB3pTBEB{waHR6EuMh-h5~uk`k7M+vEvIaxLExQW*>pdI-{3DKW%YVBD*dny8?* zuq>C1jL0v1=BDU=$PN!X5MNcqC8r&BoF&(FytjQvk62l8TvqbkYI69|N75TPntjxj zkgd-8(p2}IlYAk6_Na?js*#Q?JQW2pGghaKb}THi$K&nP3y2h8p7FzOZ`nbA~pm1mneK`eYu|=G&+=gSk~5Gg`TUifSbXOFNJW^ zwvpG-&Gm?%Ky@)4Oq!w0n`zvmRxw^6*g4#9WsS&)O7V`jvWu`hUfwb%vGVqR3yqvzbEoDNdtGt!J(lYXU5PInQ#QNnfl02K5 zBQE1OvqzJr>)9sIqn#2nO@Auz?5B$?+fYZ~7*HAH+TR80l?xEH&geJTv0w-L`JC!D zP>^#3lWoa3w4Y*qe~6UOz9q6m3tVRTWs8aLGzHbh{0+pW$SBNGvZ@=s$yc18Nn=2@ zI{!y@i>gUErfVY)@B8Zrabfqdm@ftPp)MJHex{^2!|6FMOi$qK=ws&IFi?duj_Xt7uIIA@Oz z;-4xG0ylbS_mo?+vG3*CTo5Pn$7Q~wn&6~KeWb#!Z5sE&e2sbjB@f+%V`jj>Afkfi zI=Jsuht_w}YW-z)uYG|JbO7r&iqhGK^jwJ`vtub_eO$Y1;9svR99BEFMhe4>xsv1K zG$`&dj*&nnK~u#$N_!tS0)4lGo+JncRj#pckylYh-8B^CN+7AR>5SRYG__xbkDJEp zf7frUv*#S45lL2h!L4ixa9j=$j*Clju4O05=4NK?Z%~Sk{pCH5K`J`(C`UyIMfPDN>0c zLBKI)7;!M@ce`k`UM_&{AGUuP+Xe7AaTJt}&aN=hX7+V76GrLRDw0OhRWY78_c^ys zG-F=mR+(DT2fjN;;kw21@!c??8!O+KB7qO)b;Y3cb%^Tcyz9x+yTK0f(a9>B!u?39 z);|ot@HAo+11(+1hNE@$~tpwiD5~Tubay& z9_l)xe|M1!SV+Nms;+=hYTXjs5A2XdbZxx5|Vu-zljY>gBzzCE5S zm>t8kU?TW*#;hx}t!|3vSkR>oAb$pg*IMz%?bR$|>hY8lK^=F7J{!n8oh$=+hIO23 zz6nL$`8Fk&si?0m#m!1$&oAioJ9|z&blDgwnAL`D&PkzglYE_=eth2+Yc^Q~AAO6s zR=4uXLPL-XjXEafxeSOao3#7a>lxOL&IC9ySLz{GYd3naclCC1TnDe*Uyf5Lbn7>+ zapR^ZzEYnpcCGjxC-b8REuSMueMp*~1>vA0!XG@$oIrhI#>fo`I2IITumdoaD*149 z2}k6=EH3Cxx35?@8#=orQyggFg|Hs(KvKFY-111xxJR3!5xS4|f(fwAc?!S87#<$= zIyO_M{C4k>sB@@(=*-MhRVMpP%t)xwx}w~7#8m4g^SPu)D&EXNm{0bb16+(PT=hcv zf%|YgBF(`?=y5-U?m{y;S4N(e+^HhQMQs2)bI78*o+f8OO0dL!jap1lIg*%gzGVF_ zL%DbIRsI0%VsnyxVLwwTuO;$>`Mhm^7 z>NibA)hGLenvGq0Sg7C%9Rtc^DEJ6>Rw{p+n{BPT$oe=wdK9;L+7SU8ae(MyYT*FB zr5I=JFJNQMjY)Hh^&UC40#E9qKa~%09I; zd*lhL;H?{-2KNt!VIKuCdxMD^Tvnufa2s2MHQ}aW@zu2!W}7e`AQ?wHYM&B1Flt%S zzy9bYvptHDQo`pLa0?s(QdJhM<fZMiP$9Zuw2q9z zZm#qE2Hc;g{Gt}#*Ku?CaSd;xWS=gLK7ip~+>{jv^fwP7Cwz!^R42MPShyZm;@0ZnF{_;U+^`-EO4kVW33f?#2Oc=b8Zb+Y}9?WRFXLEh+ zN#Aoq`5Dew|HqTGuq=498QX~L$o3{OGHBtE2fkf4)uF!m3%x zr9TiNgvPdF+$S~46#k!tiT{-9x&}y<^RNsy7HD=6miUpmi{O1wuGZlI= z2r%eH^Hv{+uEWZV&zL*35g{HEC6+d9@C)7ngO45(?w?hZd4y)ME|R1pQ)7Rus~zcv z6VZ887TsufZGH{16b_jrFCxYq1lyJf0MjJD{sf)tvzAa;hX48>N9|9lo=#Vf@}$1B z59vGlvf8q3SmY`87zc9S`VWlLtZNL3doz zTaYsvz`XVXLsG2NA&hrLq&{(q4&Kfm4r9e|e;CD_0zf5S*O428F{dc;fGy*zqRaZ# zSjSVEA@T{{o{hkyrD}?u)z_Y7Zf2O7$`Bn&ZeXT0X2BFLW}d0dO`Q)Eq=0M9tYbD! zNSMJ?MCRiro~C+v@WHOkjWmy(E*Sz`PwC5nuRo1Opi5M{w$a2g;DsARJ2u@)>gpFb0-xxD+MFEc5X`EH4jaYLUJo>H&FHJWHI>{*&wlsnbRB> z?*4cbb^H5;;kAVxgAgpsTC-EGEEwe8I}Au+^oR#?QfN``a?E^O+dbD_uc6w#2iY$X zgdEFu>EuXrB34M?XodGyCyf~-MAAKRfEc*vKm_|DuvG6!5$f}BNKJC+KMBUpZ@u&! zSFjZjq_FQ2d5SJ}jel@<7`fe|IsCrpWR=}@6BfIGxN%;1@$bWwd7HJ)Rk`VE3tNSj z@XrSuSi;|fg(s=BQvHE89dyflw*HZZ@>V`MvrzpC| z@q^-u4c>%suZjMLX+JN4U1#}@ECsapW0&i!`-o0G;X?7v;FT*K@d^#f{)64zF;@q6 z98t$Q?^7Th7T}UsDb$vb1b^U_O}|!S$6Ltx*$s4A7VsOOC!TsI&~|I5W)URkLqV;n z8ECzs2iI01^va$A8V}olS~2!%VhhdLGmnHR z9?%wpES~3n(R8OrhYxN)9}!Nj%ax)>8S~8tIkKf6uOfbuirlBoWUpU1ub>x#u0Fmz zw{YoKy^+U1Zr&YeJcAbm6SO@qd2Q)(T9NGzaBt@ky$DHf5`}@xJhkpD=LI87uNcKM z3H!$m0G?|(^VD+l)kn^-Hq_W7DZ~nFz=mfBi^}wNZ4q7zaKYCWVoyO%6PZ1pJ#2%2 ze$!^qxq)uB^aw_EEA#kI|G4Ikg46(w*cyC8N$(x~3~GnnyWw`-$vrBnY3E^)Q*v+F zQbgp`*mudR;1k0fD@hY-FMq#Of$0h`Wo|S(Y~HiLee%Be@cKFpCq=ky*ZjG8&d;u# zmV2=l=suKf2|a|E%AqFFiA;zG_Cx>oV6KA&*fh4Mub7bWz4^rU+%uQAAh;Q*lm~(DuXl1Pe71gQNVb$ttn>9`9%s%4Z+J6> zFXUAgP6>lf=5a0aa(X}B&^DN`*%@>$*ys@E!=s{t_S|leJ?7#4;A~*qh-Aj62f+Au zoe&YM@pS+`$ywJkC2<^CZ1utRsRmE|7q0h;H6BjDmAyEE0I5)h{cWJMDLLCfNt~vY z9hZ4`<25<2R@TxhLH&}K<)Fdq(%XuU+dAb=b02}?> zH?to%?@dP7C^Zr)&`4|T%sUc0bT%mb0yKkzhYio8wDmfv%fZjc^I0e@!D?6JKV78z zz&}HGXO1Qk+gT*o;_=d%$xg3B`tr&Pf8IL^^`@*m+Ot1Co>JkrP=WFHjDfeen|R;r zEH2`HqN~$7n>v>#&(OTZ@|=pCu@8dq@!7xcN%`v9CTLHaN08)dlCaSeB*r}9W^`rE z__G#mDnoAviU-1Apr*ARqJ`O(WgNyB4;Ka23k|cXfVBnDtPN_UY5(f-qX?a6Glw&2 zyyk~XW|yQZE#;5qBxF~P08-gcU1sJ3aCOi3&h~A)t%*0kAF9~0mEKZQ&TZ}uTv9;4 z#O$--R*z?mJk%qyS+@tbw#s{k^5aXK6fX*(lz4Y?ILFa zQP4+tF^lSgb{on^k@F)Saoq}o-f5!p3y>OxoQeR-_8DLYL0DrWwTOuQs#mmw`2$%9 zq0g$;Xn=!oq!9QuWgJC3T!vnce4-$2hcIpPUYm>B$fC8nEH59soI!0L)JiZCJGxXn zfEFz6Q@D!Ko+yx%@J8nD2ggu;gmZ#%NT61e)}iX#Q_v|{)6=3wPp~%p@OnU06mxLZ zer#_vl?LJrcg5jJfxN5{u3Ow{=#m3{{&Syj;&hBlxtyEijhH<52~~){*{*|Q{!?if zu67O`7D~<*9(YuA3Ot_fr|xasA#Sm*&SKD6cXni~D-V?CnFnBT3k3&DPLVBu(lv~r zVR<}YYMXcaw7IkZ z1~ebVOdvexmH=B@kSulm#nP2Jm&J_qeptVAo!(>)LpD(hb+WThEoc+L26aT}XJEwC zEtd#d+%e>9W^mbx4k{Wmtu)%MB{cHcg<>%Ox)08eQXM$_i$zI=tudkBz@9*_ZBS{O zd_U1?ICRF&9O8jUsSLjzhy3Ee0g;!K!dn(DtLR1Yl4g z|7Zs|YFY{EoW@Ltk@Hd-@|3XPon0`MvGdLuO}};+FQ&CAn@KX1S6f<+STPX^BRPUB zBu`hUTYI}y%Tz=+oS?x{&s&v5JWT-9)gYt8H7&E!niS8pC2-_boZ9fK+oPPk!NUh< z9xXVKm3iBI_R@jyI?$sDT=devA5WjSrDvyMDeDUaDP*?$OeCcKft&3TALUNWiX6gN zCKT9Y1#gAw1Pw*jao&!3dJe@zCehMd6PZ*9fPQW3tZBmzB9J40H!bg{E*{+IVoeAf zahQ(Np82T*c5;$-8t(l0%dVlC%77NwoM%Z(Cifia#^}L&t9sM~^g;ONx{AsltQ!R= zPsT0(pUGNu5UkUuv#?xnP@LZTt;Nvtbg39$_Nc>Rpi^EG)%qqbi3;;wg9mXBINgHZ z>^hbHa>y#1*DoGHYQhV3T@Qt>?rE#PjdU%adr>jEJdJWuuKJ3%q)WduE8qiZ?R(H4 zDaBBIYQis(VN_x$l1j?8&yyHwjZz?yKMEIo3LR;KJjW`&9|D)5$cVGTGv z8ZX59mv4bgt+&Ws{;40Qiv5%Gp`+_5Vu9ot8fv+M&RTN%b+SH8`PYBc`3YAXx12Ek zt{3wfJ#&`EpzyFdm9U{*ylRZrJmxHb5$y#D?En7N=bUJf!0pGRw0(|A(1!F7FMtwX zyS+5AKR=H2S2=)MIm@dPAal`y3Jp>v63r6i)s#)$c3(vyypG-w+v=F*}yS8rA z(tsc^moeAWD*iT^EXV;}hBKwyk^WNJ*ym7a7wKrIH3i5ckS+Gt+k0@MMagaexW9HI zYdcwR8`L`_)kED&psicI*-Y#`{qZ@eKFMn(LOYCE==lA&8xAD1f~dIH;~gOE{@HaN zDx_BgAs2$l{+q(}f&F<1_yj@0%!cn$wGJi&oz)j%wp7?S8jus(wV>i#2>k803;jmOXK_k z$x=cf*#*n*3^T_O`NI=ci!lL9`AHnE`Zoc<-lpNV?cGrh|NVCq9-#G^eYuaiN|E~O z1ftDehjC38xfNdv@?8VKm7{JXQxeqj&fl$cU}T=luDNb0M=_*>`dW?TMy%RQ-%PSq zBPUQILhPR8F)b@Hzpdr23ccAm#ToeLRej^`vB2N7ro~+G3>k~(8y_m#Z;bavjPAkE z2iN_i&gWP9g_6u~gi2x@d>tCO9Ag#V-H9Js`?1W*NEVr7G(*g*6PEXD8qIwzarL(& zvWJs(o;Q3wtFqPiaA@ha>u=JxgISh@PUM!3?0hMSY}jy189DXA9}r-aqtJCTH6L44 z!w3ws%Q}?Rh8(YY&2l;F-0OsxF6cBX2o7ER=clgsJO41jF<%SlC(onF;pcDDi)!C{ zb?l{{LfY(s@80)hgH=ZdWNG}1Qioe>#(Q!lij(;L;S7R@YunsTBRIl-X_pgYCy4ik zdS)U1n@_1_rAKzysHAss)~hbihpKq@mAaEN`W-6EhOVG8!B+*NnKap>)G++y>Fgo) ze9|OPq%1S|`dtpv=XIMsV@d7weB>{4`pC9FbX zy70)gGptOoD(pDPkI@7N7+F4`J$El0S>~_?O(14~Cpv?p@Z5O{iR=Pb)r`%s_8H5(4wtGRA=Xw6Ht&#pBi^6!&vM=6+rE?$hxt(!= zaCY6p$1~NEdAjx$ffIeVep~+k`m-2kJg^c<@i|r33?D*h`yKtn`aaYs{tu6vA5Q)5SbQDN^7DO>+}3?0pF0i9O>3DM4kCLw%0?P*|g<2={W`qdo3jLaua{C%b`NR$~)Q$n}g z0t&IQqRw@ukV#=3xYxP@Fqnf^K;Jq=7lbNL857floAHBME%fn8&_bJ%@eO z)hybiLd+K5UmR3Vw(o_Wqs-LgF-T+L3QgT6N%9!Y^JvIm*u4pU5~7ckhqD}kva+gj zHoCFA13TbJ@G*+3xD@4)%~G){$%c_vWVGERL)yV&gWpG!a+mrnrRe~9pjk|o)*j6` zs$ED&LOOw2{a$!b){YNgrOS4{^Ge~?;^{Gt9gg*lm76=kQ(BE~m9hjx2*s_YO*?W2RZQw4`}EnQf6vV$vCs7F;a(+nEOr@uk`ZKDnX{Ry*@ zQ@sny60Oh`{j1DmCoi;a@y`?-kUT*eX2B7tXtV%dCOl!Bs)`&FzBv5ZGVKwZ;tvO3 zX|-&t2~5S2noYrz*wb7uR+rNq&da8vK#&c1VW6slq&;r~)MRl<3?;W#akr7i`wUdL zv~ppd*OB??d;rUAcq;1kCn$rbVP%z!L!E)}`4pLWFf&|t-AhFXNy<~Z1`}YJ5aU;} zVLLx;nIlB_zM*5y-RKxEQXD=Nfdz*_?N5v|l-vqU0)B?8$;{{=)atY*^T907C!5ML zmNI2K98HT7DDDDi+nuh2H+cIJKyy(i5c$|i_c77Vx2HF`;RhN4_dlCGB_-7%*wZ``ZT`XzP?qZb&4rJ{jQ0nWE=( zC6>w|>M+7>c%a0=-IKZL)450~n|60tV<>h%T4NBiHXaIy(q2`xO4htNQ!i^VPaK}x zDaxnh5ZI7dNB479hG;iNL|-GS<%iaopK}|rU)HCB!#rUlrgCfPT&Vo|q~^?qevjc^ z`%CA@9Z%679QfC`5Po50nzyq^rxET~qqP0S@Nv=8O3$0cs+O6WgJ&#r+T6JrFy_*f z54yFI57OS5n<-rlnjl|qp=v~qWvjaSY^4otB?J?(>f4)H(pe^(P&u#&%4V%K7g>PM z-QH_dInBRgdcFf0Y5*1s+=0NZO9lY65!4mXM40PIey?xsC(lDj(M4>!u0mFNIabn2 z&PM)G0YbVl&j?OWFCbxatAcJNTb>q0+9n6Qc;jCZyD1;L^lA`FzqlV0zGyHIcVpi0 zC3#)GltE9xxh8s#T-0olf$#5z>hBjp@R=4x&l;<6w3Yy^8p{!cu>G@>OH!bjH|bqY z7ua21*_Kl?Ut~SCC@*pp8TA7o?Pq`DXh&}d3Fzs_Rp*z&i3G)SOK~?2sbiM3eOppjKk@o2T3f_Yy$G8sUeFmV zi_!Tk-+}Qj9E#ZLpt0`-j??RLE*tXG|8fJQupAMH^S6J~Qs(k?aKI#*YTii1_kxkp zf*6m{d70%=5(@4rBVoUD6xi%3?Mp|O;QQO$x-zZgatu5lGMjL5hYE9!Em?Mj8?oLU zN}Uprplj>h0t6}(e~Z7&thNYfUr7sI=C9eOj#?Wga%j}w-OC~1j=kP%{9D@JWgq9(ncca311YcIvmdhHdf~pC9dG=a44yRm}`!F?LvxANBL)v?q`hr`<(Fq%N!m;fxuN_kI`M!Ju!b zqBJ6qA4dez47SgsEb?8Drr2LwFW*R=#e)^AHJ9H^K^M0noD+Wg{8h5pLJEUYI+#Ps z!g>!Md&Bw2H>U#z_%^3>RM5C zlGnwfuEY`9CmiF&D&fO92S9t{h8KGwiM{?2yVVKFS-bLSvpD&FLC-*--meKgpfv7Q zKL%nG=$xh^5Qwn>VWaRlb?fP9!d8_i0G<3;LD-v zG>^Ub<+LbUx)JrW&Q?|0&#+JxMzLq-(k|W<%XMEpXDhv2Xg2fy<9uXKhPQFiWr?yc z<1=HjLNP*7KgMiwV+Kx?J!mP?u57C$jAl)@m!ve8PqgDbeHq-;J2Y>r%dNs!+chgS zok!pbi1s0O*teFonJ|nRW|l?Fat`@4u=oi*J5N=Jsq@hd73V-wbC@iH+18on${vyw zK2fn(SpV~Mlc2#FrRP&RGV$z?58k~vYaP8o2DPIlA>HupHL<2J#qdtz{lGxI$?Rif zjZ#{7-Wb}`KXUst{h%{pWHW}&-rn6Do%qGrM^Wiwzf1t#L8JPd(gRzMoERGqYZ>Md zk4y|%`}((u%2HmZC(y9*jC4v{2atPuTT6O7D%O)l1JF zaXe-Jwwq`yPC^`UOZM}4sOdlcyUOE14NilWKFYxl?L#D@q+RJ-670hvN%uvY8prXL zxT3AZ?ZLx$o?_osT(ZK7*%z3>*%}+tx(w~^HXqqAY*UUE;_{rnB`u`J)dkH8W&Zvc zk8NDdQ)*$Vm*q!S!loD5)M?xE*CG-~%&9YV2sRQ`tSYVM(XX4ZZMC6Yc2WLv?AcRx zO`38?WRdAF6U0B~k-p7#zN~=ApJ3W@{Pc}Yx6(^K&(TY2C?&Y9UL5SJE+Gkg*jjo_VIMhU3NMr(8_}0rschG@`Q{tj8D|-6u3bOk9R@M0}WMJ_WaolcuU^)6U z`*40o1&l2vSZZf^h<2=0Nbh*bW~@J2N?jr&s`@xjCL{vp9BFA^6;hS>E5vUkDBSfX zdnGapf4M7ov4ztQ5+%-KgMR)-Psgx^q2DTYb#wGPp!$0%Api0+LNNEqV{tws*BqMZ zP~wZs7j@`EKKZ++WUXti#csl?v@O z@y^g!oc^Z*w)TO|`Zb|O<^`W^g0uG-`HfbjmS$&-H1+uYv@9K;AgmpbxH~f`xo+6Z ztxNYL?2iA7{=n8i*!hvXge~jUGXeiympGjlAM|B4b9OFRujQ53@Uo)%Kd1xI`fuNE zE)^D)U!QnkLcq;+w7dKdwMPG;o?X}!s!19naXkKi_~Yz4&$Y540o(p!4X^0f=|!?e zIM%(%eQ~8@xoFcxNdK(23*tRuW4LZP<8_~*lw{snpN5p>G|vS&Z?kN!v?-#qnM76f z)N5#QyV9|}j0XwBJKCv3o4hbk$n!gm%$*}^1Fl^DD%zLLm!em{zAhNSS65k~jS>sI z?Bp3|%Kf)Gi3`#$B~plSD_u34MoK9uxjfUaKNh2%nb>(o-bw*g43@9cS75le;6WV# z_Y6*J7TpS9HX82%3jTdmXORB2C??nEQknjaH{Cw==Prl*($t8i(hjiYFMgg+Ygi># zwo-FTTt8KbRv6puc6vr#vS#2~6jt$&L@Mb$t@zfTH-Rp}bn&;lDY?aC5DSYtTuz%-p{4U*b+fp?7#5y z;%OT@&V|2>w;naW$!X&I8r`g<<0E5Jxtyd_r%4cchdsv-TcJz;)&*7~#w_%ibxeIt z|MZ#?A!$p-K6NWERGq8%hUcnEK%3j(e;8}&SbvFAU4X*o_vyCrUs5e&Gx}uh4wuYb z&+XT3b)o@U-&VpA2)7K+gDphOv^rvV+L)2RMt>`2Oz*}_`=+&YhWbp$MnRl4A^gMg zjgk+ZCa=w=%0V*0j?$hLD$G5`BUlP))KP8yC$`;r7V3CHi2qxG?ZLBBRMl|fRq+}1 z6dRYNfgh4EIbBaX^vB$|jB>}kO~dXD9!!+MnH0lvqPzH*fS8xrT)}jk9tuAmQ?nX} zvM-O`V3KHwyzP!`%IZr-IeToK%R;%N^=H}1yYmk$oU(~?Hpl$DXHEDZF_HawV?Qk_ zpR=iZEozafuJ`MdP31QUR`lJU<5we$8`)bXtQKXvZEVjlaGjw_WPrP%5Q`tf$FLC> z$U$rGE=RnMTV7>?f=kJ!o>l1$T|KRt){Xo@*#z~BKJ!~IzF_Yd=u2h@+OT`Mng6F@ zbhE4t`S|4I=HB#*=KSkwTzYXGlkFBn(OcErE*kzxUDko9`&!Ef?dGjpnEv%4LADQA zmHox$W7AEMdq-=lPD|oqt+MOhEg`(amujyFcC91~)Me-urGCsK|EW-Rr+T_q6>D|l zem`Q%McO9XU*)xpX7{FGV?#%bz)wRbIKw(HFnE6FxQ<0obHy#?qbeem~N5te*PFpXUx15-^%fWuWiZ3EEZ}d_6O0@7i+0Z*n z<~D<4AH#-kY_}NCPfVs?3{Swwx84Ue z%#-&Q&D-YqK1LdJS7~Cp;cb*}*oJ$IZiKPHJ8jz93m@~m@Gc*X{?A_y*mu#tCV5~R z((@IJ76v6w4@u1vGEn9~0wvq5Nu=z4-`TG8--pc?weMotyic%$rRB%59X^M-4QYu0`BGr$-bQ8sV+YOk#X08G}~Mfjr|J+@u9FG(xt+1|7{Uz+P;L9)@? zB$@i{HO$|O>=g~LstV%%Wj5jxwbn{f`gxKl77q^^&OFMJm2KG~?7 zv)yi$v;D(r>C+Nl9hTg6?~+`3t;AQ?MkN$EU3WNqeSm9$AGY}=e&m_gM8MueyJc_S zH3q}@v)t?$W>_$fg$-5EH6c1mU;paPc+)71Uw0doAQN&y5?OV%X-eyBRNd*}zFZQLy zM5P7yxO1}f-G%{l4x{&b8Wq^21TN9ReC&)Gk#HHtaUec68s}%VZ%&A_xX(|%ANfem z{H^+M7;dS2BG`f<;|M|RZb_Qw`?r7COo8W9wk0&6EoeaJp2R!hy5agXD%SCtW}}{Z z2^I^91AXUs1P`~g$(IvxrxSW4^3|>@_?T^#{HUKP3Ya$B)W+Den>hBdZ> z4O#EIZDgOS+B9}95RjROTHTz*n4J({r!aPv$9=+|yJQ^DmKcrkm>$+H@|+_Dg7YPR(v{*t(i#6iCEPy=&0H zW83mk$uoAX5~uI|oQjAmy$S*?S>vi^NE$N z^z9Gnh~CDDZxrL3!gboeQHETVogdcd787`InxRlo`J|WkljS#V%d+I#)WBlgwJId$YH$J!#?KImS6N?^PGsbQW-Nf)^B$!*~x*1%X zP>|Gb39@z%*C}z&GyCbAXl-ZAqbul;WYWABVYqQgvnZV{W@|2`E2Ax4FM*En2}Aje z-J8mYESB-LFsqQ!XiloxteU6A4%WkmR$oYYg&kD5p5`I=t@Bu}U!wBLbhg>s9^dxS zl)9C835-P3+6$GMmZD9IF;jm7t}pr2mLYd>Vav7Mhtft}YzgB@=!U2v{=NEq5j-;Infd6*y_(t2hmjV1Jb{4YvV}^4A@MpRMdnudkIn@d(pDTe00Z zRkrc`*U8wB$kx$iXMew#a8xSCZlKPM*xR*jQ@`R6y{%{7^)B)fX=L(@&NYi^H}oqm zJJq53e>u5U4P8B)pxoHWyXnXp9VKp_HBQ6ct!CxI zkzGm8K2qPB+q!NN%^$i#epQ*o=EnUX>%`*L>LlJ6JMd~=2)~Y9w@eyGvcV4!tb2`6 zwnOi@Zs7h{zSjkopvSG5FgJ$|3UCo*hRkae!pd2n@BurXAsI9yX`9g(c0{5@J;BwL ztNbqgc`nc8TT2BtD&HK%Y+ggNJ|yF#E&CO3+}k42S2&%GPj2Rd+YOMXS8U*Nbj;@j zG`p`^&9Xaq$LkCAt|sZ5ns>zn-RyM==(VdECse+V>~h}}OSp93>%bqE6AWrqFq>lf zdVC7R-kubj|8Q^yrCKDTt#uTJS`KTy5QsCjd(zO!+bc#=IUrL26Tfu)T3hF=l#vgo zL~W=kv&vI1oQ9}ZX7C6;OMiN#;q4zcRnH;vt6$5hOP^h4(RkTX(L5d161m!TsmV?h zabzPXV=k?IU+!Ft*MQ5L4{8n>*)s8Q6A~kLydQoDG4Nh{7Ctt-IMTsh*VJcsBt`J9 z5H3zzAhX;(FBV3HEV9koK6bIG$nBsqzxY^j?1?uzCeARTPchTBVQ$-y!u^p*vFtgNV!lrzI&O;~6vMZOkPXSkdd#s1D?q>IpP1A4o zZkA3An@QoDLUVEnyVwc#>xJoOAL1^ZHukUj@O8Uq>g=w|NO^Fn_+XqzI;4uVY9Wpxm&gc_iAN1HM)X$ z#ya}Vl*8hEf`w3F4vmstQTgY373JCw)utRQy6!QymI8mg@ocAS_E2`qwSLyIGz*vf zNF=+mzP$xsWhJr;IZvUIHUzUaPU@-PB7`ep+ePgz(G?d8H8T3qZ)8yH)wc7sS%|c) z=1;?|qE@W0$fGlLQZg!dh+|wFSNr1b+-qa*5u$6jZrIfVEkW?EZ}aC8giZTCah{&` zROW!!f2}a=+@7QI1DnLWA&Uvl9-GY!^1>O4ek}yeHb2dOo#Z1aWqI|3Fa4+fm}a3cayQD`wZ%IT&#?`Wq2^^B70 z_wDAzsj{yPUL2`4Wd~>LLwof&d+;hlmxQgOGcYUbQ$&=8iiCn1cH&B#t?jd9r$Az- z+t-vOv*#IlQ*<#*E#hbSG+dh{qL(`#fEAK#^H0fQ>T?lb9zxuk%9J=glCP{el)V1E zS+tHAiR5|JQ@X2-zl%T6RBDuH@3gKOzfF~q6_H9_7}n1K6Cb!R)8m@GHPmUGrdjm7 zjBC-%?OXpmxsHG+`WZJ5qpstj#MVC2fGI1Ki-#a9; z+#Z!j^z4!uiqL7DCME z7Szn^1rB=IW^u@CN|QXUI~%$TMygn8a#PYe^x2V7v9aW1#dA(wE-(ue4z=POG**H} z1)qgKo?hk6zIxOnw$n4{HqLm7VxClO$f8Zjb5ib@|3^-&I0b5OO)-5Eze^Fr@=iVL#!wjQBkY z;}P{8N<3H*IUyBIEFsjw{Ee4PG{s*rB{@pJ+$gqm&TwWjOOf!`vBCeiaaGgGWp))x z!3nkz_On*9$#}UhD%Y4!iShtT85llGF;mq@_GGG3CM2x6uAg;3?Pz0Jd8zpL$LPJc zGA)gyrLARFgknDsD?-AOB9v|J53)o0sIjxFTZ5K#g4_X5N*nwezxm=H7xDQQU*nNgGXK}u< z4zkCtO+o+(cq*qL%Zsi)pugp`!6AQ+_vV&O^V_EEZp>ZTT zK7<&I6ofj(KGx;^o3vAFbJly*hp|ve8SYPW2N4;^kHvEerqbi7{hVxl}R0JaKrhTP0j`Q+=1dzVDyH=8Aiymoy`{wd$9Gj0Yn>RPU^l6&b zE6;J3OuN&AeZE@I0grE{lRo&w)=S#z^JxefkSaIScu`LM?+LemlS2Rek2wcQBcp;u z^<sA zhXDpZl*^3+`#A)w6|HY|U^_K@9B1P%9^0ppkq?cHR-3-(6aL%k;Ol1(rG^?lglN{+ zKO83Z!A{YtU}#Z)oD`l2pBiOBz$YuZV_W*m!F*sL%x!hw1-p$Aw)vXpsR?uWC3`ho!@jmXEzit4oxLhg>OKfz;6KHU?pQo9exJoojIi;FD?`ch7$d zBM(qrAmtR%m9g}!d7S3$9Rx`3I#djxAuG%3!=^9w2sd-n!j%Jt`d|xZat-8SO;`O} zt4cV)ETFm295>U{kaFKs-=Gu7M<&xbl?>0QACTLnky0#Vt?o8*Seou_Hx8Cu-a`AV z=Uw{L%G8$Ns@5l37i=byJY;(vqTb+pAz~m@(h@vrI9tB;F}ti@o8w|4YQKt$vHOSF z=kI?pO)THKD@gIW=$S2+G8yl^epX^M=bP;S!u~F`jzFSSE%(bdJ<*DzIs!XM;gn)a zS*7)A>dYJhm+H3aEoB3SY|jgZx+g^D?bn{(Mc$Rp@-Pof?apPL4IJJoa=$!-=XfhTZpf0z;*#QZrEt&(Ov5;JBj6(#hEGDD9_GfesxEt=pNkg z)A?BI8-uo0tJW5x`^9A4(4-7?E_CbCgNNyEKps_Z34d;><4|6=(6@f>01AiaAo*y$ z-k2rP86@L;9NKG@J3oS#`y%PYC8=* za4cx`GbewQ-TK)bo&onzS&!X{y``l_?!sBK3-c?`Hgm&SQ~1-JukjVZJq4H_Mtq7; z&QaJe08hP<=36cpAr|!!n+a`%Jn!1;OX&SL@EnjAAI-9b;V*`@=fUKnMR@W_ZwtY1 zbhQ;Ehe!)A`kN8MNQtw=$!~tE>hZ ziay98866acWwOvDS>ts~^^+u>;;UdKz)nkdkRt)U0$_MnksxpZCH|ILNYtC&ZOZfE zgwm8)3)FG;t2doOEKj-2-b0qlTOSXGA;s+>_al{yW4`gS?cUPmP=zLOUH9gRbNrC+Uinz%rSrnH17hUbe${s`8OS4&N+>}ulYU~ zg7&(#2{IOIna!%%n`FDnkW&$h#W|!LQ!jL1Ry6Uwznj`vI=XPh(z+~I|81w&2x=5cbrD2smX?t$pr3yRZX%iJL!e&*y@{lh*@|JWM%kNS8~9GKXjP;47U@B4 zKTXMNV*fZm+~z*b>Y`3o5vt4e@v-N&G3Z}_!d8zPFkXu)^u58I0l^g%$?^c@a|?QZ zcIaI(Y6;AM79vWG+4(CM0!avJIg7`sfODMWB8Ehb1Y2-ssaNts$i2m~=G2}l2ZgeM%A+np7hE)XcK7XtXP`75XV`g^?eL2d8tQ3EOP2b=q&^0ZL{?hUa4VBeR@^th=4<|zq4p}^Ig zkLY}tjklGn(|$h|FBejOwCyTwd@JqBSJ1-RcUPKv|Dd!Y9dY~q;6YKZEcL3_%$^yz zekWlWJ>p%=A=h-%eh0gxLh4$s|HfndWzwvI3cp8d|9HEYpt_@T`cm!}oBQ{>MhV`@ z6w&$pk73Ap)-Zqk&>=euqW{qlOK=_k)3=AFh=#x%3!6AvyST2)#O{)|-r;Ceqg2_V zAx!ErcyXY7tuz{J-C$Ufd;HD! zM$oEIop_fn04Fy+-6SpsCJj+I5hAvv9+alvy!UUI5${?dp;eKMX?axRK*;>jHPWA3 zp-@Nz%8KT%(3wx3@9@BE*@_3g;SlT+A?Nz=g`9YDPFRu-)7xdKH(5eTU=QHyyLsyE zN1iNYQxOTs5PqH@PfEMWA?01PWQML28i5k3OHU}ls`Q>9^$-UVwjC>JWqM7wMQ`UJYjVg_!50BrXXRe>Q;ovE0zTWieDt)V}!jG$(Z& zZRNDP&@vgTrkL8je0o?w+!1h$`gm2i6^mm8Kj{hrVTT(*T+ccNf)2N|UhWm$y5c|4 zx8(v;(LM}Rh=|_fv-8W0hkY~7CjQ7%fo^4!KEeC5!;y(H7>mZR(XkJ21D40r!ZP1R zoD!1sDMWz`*y{LE9I{O}TNI?Gan&U#e)(3;#THV7mxeRK(n~QT&v$6*v+=fjDxa+T z&)^gfG!oX|+35ZbB=_s+l;erCVQW!#b%p+cDc_ZNHKtovl@*Q*Y8iXo!)4rLx{a!= zM2kQkt(5pXPu#}88bcdf`%RiOzV28&&Y;v=%f=Wg5bkE$TD(!x_~Fd`=iYAJEGPZZ z!s?y1i%Ei?x*XMdsoim=Bol7tH%B{JSR1lb>p{Li)l@`EVPkWiVwK14Cbx;)P+ID& zTXOaM!mQs<+8P z)}+y1kPSuM7t+xwZosaV18Eb8rT5GZ{*fNaR~*{xSy6^cmH>2v!t{Rz&?h(nR24sh zp6HS?8LSfwV%}`&Yw#OB_Q1CX*eM{hx^&5`VX@D^ZAN=@K*A(P67N1)Q3;H61{jIY zm0lFZe!=WPPo%O2XKJklY5%s8TY+Pu{ZUc;BTXv-&)CsWF}b%ciUIQSM+RhLx?+9C z>$mk-5FoF6Fs5xbwG!+-mN!yGRG*&6kxVB7xpt{Vtq)$|>e(~G7DIKu(syry~> z2*mjsU7vw0V|SSP!OPXA;R3cLrR4K9j#q_N21YBVU(Q>fLZ>u0ZLpd6CP#~|sn&fJ z{L0n=&J}1{{bLLL2d^9^=YFInkjL^HRhM%2<*8ny@&OfLg~<6BAbla{iN{xzc++L; zbkogSralWiIFwm9zwPRmWS-JA{BF7+ntT6aN%>k~vZ2y~LNO_;Xl~}9mk*qNS5NM@ zxTN3ZSKh0E_kB`Q$7%f1M|SKpuN*`7WuEbUyyQdh;wzY zQBVV%iK4IlQblX|9I{%dDPUof%^4eYCPt&`@cN+r7RY2}uvpg#&+ZZycPnS;{uo+( z@em#9t~v)_WDS1?450uF;ojY^R?x!M?^X>Q06YI9WCKkHoC+}#?U%~sdEUt)G(Um{SBZJe0uSHPYlu} zyL4w0;^+Hk-9$?YerW2xrRcaIjQzq40);~FFK%NGSe|^e^w#p;>$ccf@CEaPl)(-c zZ04$1f$|-W^qN{vwd^M=QlcgaHwwa52CQ5xtJhjxH_BV2W}95_C9~5(YWh6%VxWgj zDnv;_Cx%3?x%%!bdwqG;StaQjn$*&`$w^qOeHNFy2oUnX*bTIP{mg(a7*&vJY%N(;a0I|)fau^}X7Bv3 zAJcGt;8o<-mvX3j-^JxIQFfNsYGuuzsySFLsc z6~8P~Rxv3#YIWbG!KAG2<3M2H{YSv$Oh2uP=@N@yO)4f%0;$U%6!bpKlX%!Z&@`Zwz}c8?17J{xEc7ggX7S$_q~!V1?HoEYDZ1sMa~H zhlBwoPV;G+w)<>PXpjn6-}6Vt6F<=ZU^|ijyu_<1r0=GWM_UA_{8s*mi!tY0_H$e&(6((v0sQAC7tNkesCEiA~p4u|P?KEJic(^1Rc* zJ*bg&@K_d8Wm?FE{>}M$C4tX_85RfHp%h&8a&FXK4oMA^9V|+dkf}V>!9FbW|3khMW$u z8EYTOC(TJJK?wva|I75PyZ~uE{rs^w7xPT;DFG(MV;@G;nH}LC8JQUd>>~T1cXJ1) ztpq!cs!N_&m_IjlA3qE~yJpJa-2ku2u{9iL^%(5Dh96L*)Y|oT_8FPCZN8HA(yLG@ z@o#m|;8m8JfiIOaFCHrHRN0ic*aVyB3mK!IEyaVKJi5562DN8LvnU(0qC{O&q zr4y1@`wM+BZ(w#W?!P|v@lM94h_E-R!54Hw*owQrg&DW+V)%KgU5}}g7cDTHfw3RJ zmVD=L+ji$};YkZFy2#$OTx5xDGGmlWrNz>b9hDY(Ze{+__La%F`$YZ@ zSB2tFIN4aNt3_O~y-*>x;*4d7vT31<9y->$$aFB-U3lhBagM^MYVyzs^`(`QlA0FR zlb`i)%pcm#!_6v=UyHes3j|id9sECc8o%#jMX)1tWKQr_O_(BeAPt^sGba$Aly@X$ zh|ik`Z%T_2Z{TN^2P?3N!`fB$t+V*0szGD;g_#FP9xkq`0clKM;Cx3^U;1-_{sTMC z^e=)+5fRljBB!=B5G!h!5`)^A&6*l&>3vYB%KYlqWK+09HaIVf=o;h#({+kf8?pR!8dUdRK`jDI8*;DcQNJ=n9RAg4q zAY*YSk$Uu|(E)K|D>xJo8)2J?Q5H<_#KZQ?#p+lw8Ov~7J`8~gb9Sx$Oj16O-?&q8 zPaOYJ`|jl0Wy`Sy(e4xDPFJtAn)~RkmV4r1Bx>~~jcKIA3E-&8C!qHotVI1gW+A9r zSrBOCO2Hm0sQbc3ZN6(`%GDH*3476Xn&8t7Z2WB^misrVNh;YL^C)*;o898v$V`Zl z0Y1{jPV3y<=e2M&c016-hD9%|BS-5_H&RoI0Ixe1xb*xI+g#vbS);pRBtarccvyA1 z>=`ceP^rNh3m!fhP{g*7-yN))uR62k<^N%Gk@)L)Z*`asS4f;;hc0o0!C%;n`OQl8 z!67zYwEOJ$g*;r^HLqHMFEVXROq1t&euP*@M?{p*Wq1|rJH}$J1BTitC(;enBy>vw z-;?7JdZRg=|E`f%J8S02h|-L)vpnM)t+og=;!rK6!kZBR4~(N$F~;zJj0}9Om|&Q8 zV}4`H@8+3bM1~bl`G=JoI^0_da2P(^;D=H)3-v3Z*@cT$JX_T-o3d`%mU;-dhQMx> zl^oi(Piabti2)yDuI(#$R9#~E1rU6gM9J4Att(ejxptAY7V7E?<+z=Db-gkk1nY4l ze{TSNt`-EafVvq>%Acn4zY&`EF9Csw-v`P{n{dK1TJ)n9@+s=8h=_=-Svl4jH->~h z4+4DJ!{iYwu+F!UPFjy6bu>3xxv?ihi?iJ;qPpJep>LtwnL+%5-+)9kbwQIz(vXaw#ybL?F&T6v+fg;wvPm-hfw!j^LyGl54>nA7%RQ79@|@UQPI}V^9dBZ z$^$D){ya0YC2WcwX7C88{|Fr#N)0?0Gz))p2ZZpM%`J#nk_V_1L7iNq#VL;znYeh= z_3Cj(gk?)cHv`D_7@)&^&9pCFHlo&UvA12y{ZCH^tKeX! z8b7LBdq2%LB6sH!+OD;6ktx=UiuC0DWj!KliLJvvH-OYm;se*i z`b9vX4Dmy#X|I~#@!$3(M8p*vWU7I$@0M;ZwqkawsJIKoRGfT|ARnGpMJ6HKkU>{; z+<1MUpJ21!X%@L#Kd;fUe;Zi|0V?J>yZjpKmxka0=dUdd7w0O398`s{7&=St0wcTau zgrb!@z#dfg)~bt<+K|H5G}TZ#+xVEV$^_EVDN^g;NPVOzx1M)8HAkvCTMNl~QIbC= z<4upK#CmpxMSB8Pv+}sDq?Hx?crjsMFC(q<=HN;G3Q$(2|GCroq3OALP$>g6)rW^A-R1HXu+x*SJ$#BXRAiejvoKi^htf zrnCg5Y!ayPA-VO5NfU*|bxKQX#jeRTwUU;?(7XYc6z|DuXcT8~>#THN1nj|A7|x^4 zh8$|}p7PXpG4jO0LdMb8`kTdqgwb}WqQ=7yHU~Il{2+E?!4lHQeMrqRh);Xfvny=Q ze!9TkBrs*o#(SMJWH+v5@r;4`^xK2I#x0^++eDYBNX1bQXd!fGez=Vsql4h|x$0ia z8EM{cXfUYo`OF2g@W(zD7!QbCP;%dzF7NxIAjyG*=a)LpXs;ldRqUHCzKRbSl$Bjp zmd{T5%HMsew1I=f1_G&u9u!rd9n;VjSTjHy?n+k{F+yt%mexX+%5&V{?6{a(CD$>H z+Y^>CTQ}=+1qa>by&7*;=+F8aPjP#vd(`&<2rxV0_p67h4<<*QU$~4nW#POA z@gx5Ix(phk_hT4tG4m*BupBO*yD2UBIWB_t_4d-yk0FN$+D5GePmJO0%GQW!mflpU zUUCfXx%toN;bu4kNQ;%OaMzi?`XLN2p)c(iU>iR2^H(%Y<{|4lSMAX?O0E_b%*STb zXRWs0adPOtQd+H>erq0t-1%bVG)Z()N3R9fGPX7r^lEv|aU*a?E3uE>d8nE(A|iS; zOV>Ws>U#q&6eq_R0P;5@AXS}Er>sjk-b{#NtuD!oP|N3>%U73Ou1m3XZRO?4YaDy9 zl>cjS3wnm>MOG(1{n}9Bt&XQnGZU>O)e$g2mrei(Sz^|##&%=LBu~)_+3}gs;qL1- zRLBZ>t*HsJLpkp3x@UWo7i)TrKWe)w-_WPJH?sww?iH6>{15@dHnzRh?}sQtVrN)H zJW>MF3Jmb=ifK||I<1b6q>E_`U%wIeOLYK+K5G8RQ&@S;-E_*3LFK@z*)U9J? z)TfMCvmO9Dz4W5vU05?3qZkI6ENYAVAfU8t)xL{#>(&4eSAID@C(E7tntTN(?~qXTW9aCba^U#|ew(@_!+vmy zT7kO5!M(7yJW@+P8NVFIneihqWB=h_nZD2Y1I+a9N&k@BXlTS`PHXn$j#>#3N<)_+ zN*??05QbIU)y~?mE}|f_(|-2)LByL&Z>@Yu6tXduROxrGwXu-nBkSoDW1U&G7dcu; zz1_4I`Mq6pN{ebWifL{}@L(Omp3R66oy6Xf;)?pwQJXno=^6fww-SiwR|~UdB!MR-CqtvzVl5f7ND0+{Vl}6Wz;~wKuf^t@*sI z>6ZFJIszcDO7=9R>I*-BLSyr$PxXr*5^c+K74A`|ERKLOf~IQ}1f#^n#7I3Ow9h|@ ziB11{>Hy=KdIZq3TWty%IwMl19nc=BZq`Q@(!jJX2{}318(z86+9+@UQN42I%H3=B zG_x3Pr4$>1YF}HZT-8&I(gP7Fp~-v{;lTv6*3RF?TsToHp0M`wo_|t^uPwI@YrBK7 zPUhu5NCYz|lp|uM+x}nS7RiQ-?`< z<=v&^V!H$;gzVJ2K7zo);77ye^UetHu*(l3SnH+7Z5w+jKZvO1L^^$=Q8EDEKG^f2ER!blVDi}KeZnY$HQ)#@tvQz20it#X!)qR zu$<+Y1gmlQxOID;KmWtvO8r8m+xxdqpi82ETM1FuM;CGC9PI1GUPjjsk;EnO=ZlN* z9oIYC!NjWU9p~iO@btjgXrmmvtQEPYUXAcAYW^5QD z_)l}oW*CNZChTYQoINSDLELRVDJuzb+%rpU_vasjU`o81s!9)a@_iy4R9&EC2cGfH z*wMU;Q3o$SSH$uQ8I48rpRKAVyNt22y{K#kTRuv~zbfuZjM4aMoV zabUWu9mcL09Yi188djXqgyJgk0iHa81D~_cQ8ysej#)p@o8v4iJ}12d_maYtSR@;$ zv?pQ793W6^fb{E_tH22zI4;u`=zh&lF%%mG{c-l`!K*VYz0p9IdbZdIetBoND-7%! z{@LnoY5v5Wu;ZUkg0}YLJ!0^u+LRr>Aa8F)mvf+;EqSvB+SKpM7mMSNXbTOa3(_fT zSnhoD{+?Wc-My6yc?4aMvU`&-oU;l2^I@Hme2XH=0_0d$Nz#8)dH=#h_Bk7U)!dx4XWDpXUJrjhKKkV zxWWP>Z{mlj5z2%tKRBGdnqM=9QEu>b!c%b7dE2i@WBD`Z`p^!tl2$3|^ht{f_r<*R zaDy^q?X6yJ+#y3tOQLlrYPYvDAqiwW#C*({v-W%nKl?UOq1;|cKS_T;(>{I4`Nn*% z&GUIv&>O2@OUmay{rux0K2xsPbg$!whfR;z0nAI-^DX>$)#p7X*$PV3l$yF1#(1xp zH7Kx)mEG<^E33YkMXrHVrHqEk>=RkCyTSc2v^I0oZ@4dmd%=;_91Y2`ml;kW^~a>{ zANMF+ty&$k?MgDQX)B8#%aOefjogz@?`(;!Td^q;^@iAs@C28E5{kt=B}&A5hn=MP zh#8L^6GSf`%nV))RyjDG^nP))-g|?%>7afL2@xOydcsX~|5-#$%~SB);0StJmRE1Z z=-}(TOGC2bSufM@2EgB*euCLS^3oPt|rVg5Fn-DD;cM zHt=mUDs8>Qe}$imOKElOkV10}i0%1~gM(y^xF&HiF`0LzG(q+gRgBEX?LxEknSThr z^%Dy?nNj%J<2SrN3uHe&uFV^;F1a@iabn1LV}mk4oxXn8CQkF(0E=k-OaIxN;8y#r zvOz!ltl4wPoyJh({sDt7#v9%?^~W61<{irZw-%$_;W@DmKeKebotaAPTCx)MSZdbp z%2})qi0>WFJ+J3@e(*Xz_i>co&K)A+;G{s|gyfNj6(m|^7F76QY8q) zrmJ4{uK>W{_>@1j>+v&CN?7`bZU55M=d-T@JefmBe?boy2T>g#;0 zj3BLF|LZu+jEMK<@)|KhJ@760Y`R0vULNL_X>)4tqn4V4kkDR97zlKWtFQRqVD?I= zd03OUJ8ywopk9G>?kSs^0<(`xM>|Sw%I~x(fNY;7ty?U3F!@sf1F!SnrU1%dDyRnB z>kD_;7(jjo|F>TQyzu`tph||}dk`4yv>mEvNkfd(Lbm`{=tfX7odGBf#JV#8@0eDW z`_t}o1zd5zP`Dd0!uidX(;xp=<2=Px+FUd#ZU>2`qZOcFMEZ?2qsX)YG!k zvp`sr5KR#U7$r-2AR>ZtffRyO<^qAvoKCl7uqEXu12oo8tDd*>Pm}zE2$x{@Unlz} z^xOI6x;6qH7Q=?c+5bLSTgK@c9*|?=h;^YOJHRhb{Pl2}#O}BE$vX$en&;V35;;-!B zAL8)Bx33Aoc~>~kcdj@LDZCdOc6qwS|1R*sa_aPC(32w=~NS`$5nP?`TXS$z{E}%ng(lD4*j{Me^BO4TI*h&h_bLqEb(y92iQ_w!Ug!v6FpKJe=f z$|!Iby;qXIATX2cJ++O!1glBLWdYvocc+(b9$;T^#g=W9U4qSc&{{*=0f9z!mDGad z{Wr5kF|FAiNSn%Jyi%7S!_y~p_Z-tT{O%mXnbv&OyhjBgeL}T&G(YVhmUcPx-`!xZWC>38BlHaluKKHo$}({ksW^{Q{gj>Y4LZRm`XB2_8g8_bfJ(zG$F9h~8j#q*X=2Osf* z6int(mxYJ2m~yx45OJ7aciN2NhSy}ixlg|nlCzOmEOrSTIx0pdfd6T_Q@Wb6INvMK zYqMrG9f%_laX*lf6BP7QF%O69y;FY%!!9$>a`aFHm zmnwrii}zi=UF!GH4Sv}GGx2DlTbN!$Z*uE~LDdS-u4kmd&t+Bzfh;TKZ7R(z4(ipP(GyKvYV++{pl=wqsNYqmt<-pZYk($NCK9pi=}qA@aH zQ&I99KWo!dkoyzlV6-m*$)E^C+5X9b zyjGbIqrr=VXO&-N3k)mbi+x`?;A;i&Z-(d>)en0v_ZvFyz>^)J{KG(9W;MGhbu><* zD>Qp-XC|mGF|2StckkFujd-VpEuc+B6maR6r^*v!uGg^jHQmN>e?Y1&CZ#G0?^PeK z9paWew_jmhtR}Nd?osN@Aa$W8&qE0HJMFa&uM^#Cl~yn33^-eQHSXikl?V&WW_-4p zb)^*|VOV}vMaCZLA(k-vj(*H}>3NOnhvTCcL-PXPk>3TzW2?M-&sW~nv0uKY3$5W%9thDZSMQFrp?v-_P4A}Dxbg8e{c^7^ z2Ds(Bcv&qm3b=7;s)=D7N?VlxNFtsQx!hf!Eq{ml!x2Qh)j!ag?EYIs`2JK>< z!3sSa%@hX!>|7GUp`V8_?v44iKL^)!caLR$Hs&jvP0k4-lA6cb^Kx@5Ju^KVw&Xlg z%u~ick{u_CCcWZuYf0an4AqR~rVJy}@~Dye=0|a?MChk4{|I#M$gJlL90gNsV zd03CP+v&tX3evII4#k}cPto?aD$X=BX=lhWjGl|b?6A@rpj3Z?G{;%B3k%Ue4>um< zez#L(6^631go+GWt;yZn>wxsey}ZEn4{m{};Z)b&zJh!lqnS77;VX`j(fX|T{*^SL zqKIqDy;%#9eyk{H#~FVp01uj(?n0H+j}=hf&rFxvFCxdr-G7(BC=VhM>xP|iho_<8 zm0|9U=4PV!p}|_%`=(55ujO3C?Zu~?sSS_K72{JX*$9(!-?sBltL(taVszO6(nzDM zfdOJ^FM4oCfi>fwLe1XBhvRIf*JcMpV#n6Lo;zVb zIF=CgWq2)7SmM1MvQ3)_VNtT`a>2#mqXM&6&L8qx>Oql%S-ObfbVT!_@>X!nBH36h zd*v@dzZ$kWI1HkXGn@F!R5~mNzmj!L(Yz+O;qf3HkS5bVc!%&Uf3x>bgZElQWu81= z3!YcAWIhRWbK6Z=gzV%Sm>Ag_o)x5fOuzocW5PUT1B%5X&tBd--_OIu2e0#Q2EAnd zn7rw}r}dcGAo&*cFwWAWt8E=Gr}X2UB>D9bI}TRsP}SZu z+6p}6?lc?_L9qIl2m&2PrviQqNChwz^EV67%?Wg3a=7I~XoR(0=F~7|5hYMbReW^X zdt1wQIA-pS9VBH7oI}YU5|nUP^N86uo}8iX0qMGfvUP|1vpE-kBLNve z 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 diff --git a/doc/proposals/shared-memory-transport/sony/improvement.png b/doc/proposals/shared-memory-transport/sony/improvement.png deleted file mode 100755 index b913dcdbf2d0835a906bddc6c06a7f67bd79f6c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36300 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 diff --git a/doc/proposals/shared-memory-transport/sony/ms1_rtps_shared_memory_transport.md b/doc/proposals/shared-memory-transport/sony/ms1_rtps_shared_memory_transport.md deleted file mode 100755 index 6bce5cff89e..00000000000 --- a/doc/proposals/shared-memory-transport/sony/ms1_rtps_shared_memory_transport.md +++ /dev/null @@ -1,127 +0,0 @@ -# Overview - -DDSi-RTPS(Real-Time Publish-Subscribe) is the **protocol** that enable to support vendor implementation. And RTPS specifies implementaion and message packet format and other stuff as well. On this proposal, it will descibe how we could integrate **shared memory as transport** for RTPS layer based on. - -# Objective - -Implement a shared Memory transport using the current Fast-RTPS transport API & Architecture: The transport will be used as any other transport (including serialization and RTPS encapsulation). This approach is used in other DDS implementations such as commercial release for OpenSplice and RTI Connext DDS. This is mostly related to ROS2 RMW transport, but it can be used in any DDS application or product. - -# Requirements - -- Multi-Platform support (Windows, Linux and MacOS) along with ROS2. -- Design and Architecture Description -- Source Code [Fast-RTPS](https://github.com/eProsima/Fast-RTPS) -- Documents for user manual and tutorials. -- ROS2/RMW compatible interface (do not break ROS2 userland) -- Latency/Bandwidth improvement results. -- Intra/Inter-Process Communication - -# Architecture / Design - -## Interoperability - -There is no gurantee that the whole system is constructed with eProsima Fast-RTPS, so multiple DDS implementaions may be used in a distributed system. -To keep the interoperability between different vendor DDS implementations, the shared memory transport feature has to be implemented with the following: - -- All communications must take place using RTPS Messages. -- All implementations must implement the RTPS Message Receiver. -- Simple Participant and Endpoint Discovery Protocols. - -## Discovery - -Participant and Endpoint Discovery(PDP, EDP such as metatrrafic transmittion) will be kept as is in the current code, since this negotiation does not require shared memory use cases (all of the RTPS protocol stays put). - -## Memory Management - -- Dynamic Configuration - - Shared memory transport should be dynamically configured when necessary, that is, when the reader exists on the same host system than the writer. This is mandatory to reduce unnecessary message passing via shared memory. - - This can be detected using the GuidPrefix_t information in the locator, which includes vendor id, host id, process id and participant id. - - ``` - struct RTPS_DllAPI GuidPrefix_t - ``` - -- Lifecycle - - Shared memory lifecycle is managed by the writer corresponding to HistoryCache more likely QoS setting. - -- Owner - - Shared memory is owned by the writer. The writer is responsible of managing the shared memory (creation and removal) according to the aforementioned lifecycle. - -- Version - - Versioning must be used to check if the implementation supports the shared memory feature or not. - -## Shared Memory Framework - -Since this whole project is targeted to be multi-platform, it is mandatory not to use system dependent shared memory frameworks or primitives. - -- C/C++ implementation - - Primitive baseline implementation, can be used for multi-platform. - - But most parts need to be implemented by our own. - - Also good affinity to intra-process, just use std::shared_ptr. -- POSIX IPC shared memory (shm_open) - - This is only for Unix system, so not good affinity for Windows/Mac. -- **boost::interprocess** - - Surely multi-platform, this is generic and up-to-date interfaces. - - Generic shared memory interface - - Emulation layer available for windows and system v(xsi) if necessary. - - Memory mapped file (this can be useful to use ramfs to refresh system restart or reboot) - - Shared memory range can be truncated dynamically. - - Container mapping with allocator - - File locking (this could be useful to exclude access to the memory mapped shared memory) - - Writer has read_write mode and reader only has read_only mode. - - ***But cannot be extremly optimized via system calls, such as hugetlb to reduce TLB miss hit and pagefaults.*** - - -## Event Notification - -Writer needs to notify right after the shared memory is ready to be read on reader side. Then reader will be notified that data is ready to read out. - -- RTPS extensible message - - Submessages with ID's 0x80 to 0xff (inclusive) are vendor-specific - - But probably we should avoid sending messages via network. -- **boost::interprocess** - - Condition: after data is set by writer, notify the subscribers via condition variable on shared memory (named under topic name?). - - Semaphore: after data is set by writer, post to notify the subscribers via semaphore on shared memory. Can be used to control the number of subscribers to read via wait API (named under topic name?). - -## Security - -- Encryption / Decryption: - - Shared memory will be used as transport only, so encrypted data will be stored on shared memory. Therefore, this does not affect anything. -- Access Permission: - - Can we support access permission? Like file system based access permission? This needs to be considered. - - Since security implementation is different among platforms, boost::interprocess does not try to standardize the access permission control. This is responsibility of the implementation. - -## Quality of Service - -Since this is just a new implementation of the transport layer for shared memory, where all the rest of the RTPS protocol stays put, we expect full compatibility of configuration with Fast-RTPS. - -Nevertheless, this needs to be further considered during the detailed design and implementation. - -# Considerations - -## Intra Process Communication - -There is an intra-process communication feature in ROS2 rclcpp and rcl layer (basically zero-copy based). This has nothing to do with DDS implementation, but needs to be considered to ensure this feature doesn't break when implementing the DDS shared memory transport. Refer to [Intra-Process-Communication](https://index.ros.org//doc/ros2/Tutorials/Intra-Process-Communication/) - -Intra-process communication does not support QoS specification, e.g) RMW_QOS_POLICY_HISTORY_KEEP_ALL, !RMW_QOS_POLICY_DURABILITY_VOLATILE is not supported. - -Intra-process communication uses a ring buffer that is internally implemented [mapped_ring_buffer.hpp](https://github.com/ros2/rclcpp/blob/master/rclcpp/include/rclcpp/mapped_ring_buffer.hpp). - -**this implementataion will stay on rclcpp for other implementations, but will be decricated for eProsima Fast-RTPS use-cases basically.** - -## Container Boundary - -Using containers basically means to divide the user space into independent sections, so shared memory should not be used beyond the container boundary. - -This can be actually done just checking IP addresses to see if both participants are in the same host or not. So we don't expect addtional requirements, it just appears to be another network interface. - -# Reference - -[ROSConJP 2019 Lightning Talk Presentation](https://discourse.ros.org/uploads/short-url/1SbbxgRCiM6NH2BuSCqNAe0aogx.pdf) -[Boost.Interprocess](https://www.boost.org/doc/libs/1_71_0/doc/html/interprocess.html) - diff --git a/doc/proposals/shared-memory-transport/sony/ms2_rmw_shared_memory_data_share_sony.md b/doc/proposals/shared-memory-transport/sony/ms2_rmw_shared_memory_data_share_sony.md deleted file mode 100755 index f5c9770155d..00000000000 --- a/doc/proposals/shared-memory-transport/sony/ms2_rmw_shared_memory_data_share_sony.md +++ /dev/null @@ -1,87 +0,0 @@ -# Overview - -Sony has already done implementation using internal shared memory light framework to connect rmw layer, so that ROS2 applicatoin can use the shared memory publisher/subscriber framework without notice. This is the same target for milestone-2, so this documentation describe about the history and feasibilities, and also basic design for shared memory data sharing in linux system. - -# Background - -- We need to deal with a large amount of data for recognitions, robotics, intelligent processes like agent device. The data has to be shared among a lot of framework and process spaces, otherwise copy in/out system space overhead will stress the system resources. especially embedded devices, this could be fatal issue. -- It is impossible to complete the requirement with single process even if that is the embedded consumer devices. Data shall be shared in the host system efficiently so that application can use the data without concern. Besides data size is getting bigger and bigger such as 4K, 8K images, ToF, Lidar, Radar, PointCloud and so on. We surely need more band width/high latency data sharing against these situations. - -# Requirements - -### Publisher/Subscriber Architecture (N:N) - -![PubSub_overview](./PubSub_overview.png) - -Publisher: after system calls to map and create message on the filesystem, it will directly write the dat into the message. Then at the finish writing or closing file, that will be notified to the subscriber with file path. - -Subscriber: file path will be notified via inotify, the subscriber to get the corresponding message to open and read directly. - -**There will be no copy insluding user application or framework itself** - -### Remote Procedure Call Support (1:1 asynchronous, such as rosservice) - -![RPC_overview](./RPC_overview.png) - -Unique ID assigned for each message, so easy to recognize who’s message. - -- Perfectly Copyless Data Sharing -- Low Latency and High Throughput -- Message Lifecycle and Timestamp support -- Data Access Control via Filesystem -- Storage supported as backend (user flexibility) - -# Design - -## Platform - -Linux 2.6.13 or later (technically the platform supports [inotify](http://man7.org/linux/man-pages/man7/inotify.7.html)) - -## Data Channel - -Basically in-memory file system such as ramfs or tmpfs. but this is not a limitation or constraints, user can choose the backend file system to specify the root directory. ramfs and tmpfs is actually memory storage, but it can keep the file on the filesystem as long as system running. this would be also good, once the system reboots it will refresh the entire cache data, we can restart as clean. - -Taking advantage of linux interfaces such as map/unmap to assign the physical pages into the user process space, no additional overhead or stack will be provided from this framework. - -## Signal and Event Notification - -from our experience and benchmark on embedded linux system, [inotify](http://man7.org/linux/man-pages/man7/inotify.7.html) came up the candidate number 1. inotify is also provied by linux kernel and it allows us to notify events on filesystem and what kind of events and what file is actually changed.(written, closed or opened etc.) this is really simple linux kernel interface and also support message queue order guranteed by linux kernel. - -## Access Permission Control - -since this framework is constructed on filesystem based storage, we can control access permission just like we do with normal files and user/group permission control. without certain group or access permission, user cannot even see the files or any activities by this framework. - -## Datatype / Serialization - -Do not serialize data into the shared memory with publish/subscribe. So user application needs to be aware before to write/read the binary data fits in the certain structure. - -## Remarkable Features (Only Related) - -- Configurable parameters for each topic - root file path and ring buffer length to keep for each topic shall be predefined. -- Ring Buffer / File Mapped Shared Memory - Ring Buffer is controlled by framework, e.g) entries of single topic. -- Retain Memory - once the file is mapped into physical page, it will never unmapped unless it is necessary. - this will reduce the huge system time via system calls. -- Huge TLB - also reduce system time for cache miss, pagefaults and tlb miss hit. - -# Feasibilities - -With Sony internal framework and rmw_sony_cpp to connect the implementation to ROS2 frontend, there is a huge performance improvemnent that we have taking advantage of shared memory. - - - -of course this is only prototype and Non-DDS implementation which means in general there is not a lot of processes that is required with DDS implementation. But even anticipated value expectation in prototype, there is an improvement as followings. - - - -- Publisher:Subscriber = 1:1 -- Serializer is [Fast-CDR](https://github.com/eProsima/Fast-CDR) -- Ubuntu 18.04 ROS Dashing -- Skylake PC - -# Note - -This is just for sharing primitives, but we can work on this feature more generic way and keep the improvement as it is. diff --git a/doc/proposals/shared-memory-transport/sony/rmw_sony_cpp.png b/doc/proposals/shared-memory-transport/sony/rmw_sony_cpp.png deleted file mode 100755 index eda23ff7ecd242d2c5a3a8be7a255dc9ed8b881b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115480 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 diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 88766a3b3ff..d63b96f986c 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -12,6 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(fastrtps_FOUND TRUE) +set(fastdds_FOUND TRUE) add_subdirectory(cpp/dds) add_subdirectory(cpp/rtps) diff --git a/examples/cpp/dds/AdvancedConfigurationExample/AdvancedConfigurationPublisher.cpp b/examples/cpp/dds/AdvancedConfigurationExample/AdvancedConfigurationPublisher.cpp index d606a603cc4..63420653ed1 100644 --- a/examples/cpp/dds/AdvancedConfigurationExample/AdvancedConfigurationPublisher.cpp +++ b/examples/cpp/dds/AdvancedConfigurationExample/AdvancedConfigurationPublisher.cpp @@ -17,9 +17,11 @@ * */ +#include "AdvancedConfigurationPublisher.h" + #include -#include #include +#include #include #include @@ -29,10 +31,6 @@ #include #include #include -#include -#include - -#include "AdvancedConfigurationPublisher.h" using namespace eprosima::fastdds::dds; using namespace eprosima::fastdds::rtps; diff --git a/examples/cpp/dds/AdvancedConfigurationExample/AdvancedConfigurationSubscriber.cpp b/examples/cpp/dds/AdvancedConfigurationExample/AdvancedConfigurationSubscriber.cpp index 807942606c4..8323c5b9874 100644 --- a/examples/cpp/dds/AdvancedConfigurationExample/AdvancedConfigurationSubscriber.cpp +++ b/examples/cpp/dds/AdvancedConfigurationExample/AdvancedConfigurationSubscriber.cpp @@ -17,6 +17,8 @@ * */ +#include "AdvancedConfigurationSubscriber.h" + #include #include @@ -27,10 +29,6 @@ #include #include #include -#include -#include - -#include "AdvancedConfigurationSubscriber.h" using namespace eprosima::fastdds::dds; using namespace eprosima::fastdds::rtps; diff --git a/examples/cpp/dds/AdvancedConfigurationExample/CMakeLists.txt b/examples/cpp/dds/AdvancedConfigurationExample/CMakeLists.txt index b58e08d8e87..16a28f79266 100644 --- a/examples/cpp/dds/AdvancedConfigurationExample/CMakeLists.txt +++ b/examples/cpp/dds/AdvancedConfigurationExample/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE $<$:SHM_TRANSPORT_BUILTIN> # Enable SHM as built-in transport ) -target_link_libraries(${PROJECT_NAME} fastrtps fastcdr fastdds::optionparser) +target_link_libraries(${PROJECT_NAME} fastdds fastcdr fastdds::optionparser) install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION examples/cpp/dds/${PROJECT_NAME}/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/AdvancedConfigurationExample/README.md b/examples/cpp/dds/AdvancedConfigurationExample/README.md index fdc0352d5cb..c31397f38f9 100644 --- a/examples/cpp/dds/AdvancedConfigurationExample/README.md +++ b/examples/cpp/dds/AdvancedConfigurationExample/README.md @@ -85,7 +85,7 @@ QoS options: Discovery options: --ttl Set multicast discovery Time To Live on IPv4 or Hop Limit - for IPv6. If not set, uses Fast-DDS default (1 hop). + for IPv6. If not set, uses Fast DDS default (1 hop). Increase it to avoid discovery issues on scenarios with several routers. Maximum: 255. ``` @@ -100,5 +100,5 @@ This code presents how to run a publisher with this example without Shared Memor ```sh # From AdvancedConfigurationExample installation dir -FASTRTPS_DEFAULT_PROFILES_FILE=shm_off.xml ./AdvancedConfigurationExample publisher --xml-profile no_shm_participant_profile +FASTDDS_DEFAULT_PROFILES_FILE=shm_off.xml ./AdvancedConfigurationExample publisher --xml-profile no_shm_participant_profile ``` diff --git a/examples/cpp/dds/AdvancedConfigurationExample/arg_configuration.h b/examples/cpp/dds/AdvancedConfigurationExample/arg_configuration.h index 96cc666d4fe..997360b7e9c 100644 --- a/examples/cpp/dds/AdvancedConfigurationExample/arg_configuration.h +++ b/examples/cpp/dds/AdvancedConfigurationExample/arg_configuration.h @@ -239,7 +239,7 @@ const option::Descriptor usage[] = { { UNKNOWN_OPT, 0, "", "", Arg::None, "\nDiscovery options:"}, { TTL, 0, "", "ttl", Arg::NumericRange<1, 255>, "\t--ttl \tSet multicast discovery Time To Live on IPv4 or Hop Limit for IPv6." - " If not set, uses Fast-DDS default (1 hop). Increase it to avoid discovery issues" + " If not set, uses Fast DDS default (1 hop). Increase it to avoid discovery issues" " on scenarios with several routers. Maximum: 255."}, { 0, 0, 0, 0, 0, 0 } diff --git a/examples/cpp/dds/AdvancedConfigurationExample/shm_off.xml b/examples/cpp/dds/AdvancedConfigurationExample/shm_off.xml index d02bf86f1ad..50d23e0c3ca 100644 --- a/examples/cpp/dds/AdvancedConfigurationExample/shm_off.xml +++ b/examples/cpp/dds/AdvancedConfigurationExample/shm_off.xml @@ -1,6 +1,6 @@ - + custom_udpv4_transport diff --git a/examples/cpp/dds/BasicConfigurationExample/BasicConfigurationPublisher.cpp b/examples/cpp/dds/BasicConfigurationExample/BasicConfigurationPublisher.cpp index 1f231adf86d..3734b53436a 100644 --- a/examples/cpp/dds/BasicConfigurationExample/BasicConfigurationPublisher.cpp +++ b/examples/cpp/dds/BasicConfigurationExample/BasicConfigurationPublisher.cpp @@ -17,6 +17,8 @@ * */ +#include "BasicConfigurationPublisher.h" + #include #include @@ -28,10 +30,6 @@ #include #include #include -#include -#include - -#include "BasicConfigurationPublisher.h" using namespace eprosima::fastdds::dds; using namespace eprosima::fastdds::rtps; diff --git a/examples/cpp/dds/BasicConfigurationExample/BasicConfigurationSubscriber.cpp b/examples/cpp/dds/BasicConfigurationExample/BasicConfigurationSubscriber.cpp index cd333888698..4c0f1b9dcc5 100644 --- a/examples/cpp/dds/BasicConfigurationExample/BasicConfigurationSubscriber.cpp +++ b/examples/cpp/dds/BasicConfigurationExample/BasicConfigurationSubscriber.cpp @@ -17,6 +17,8 @@ * */ +#include "BasicConfigurationSubscriber.h" + #include #include @@ -27,10 +29,6 @@ #include #include #include -#include -#include - -#include "BasicConfigurationSubscriber.h" using namespace eprosima::fastdds::dds; using namespace eprosima::fastdds::rtps; diff --git a/examples/cpp/dds/BasicConfigurationExample/CMakeLists.txt b/examples/cpp/dds/BasicConfigurationExample/CMakeLists.txt index 5b951d5e9d2..ba91f9520dc 100644 --- a/examples/cpp/dds/BasicConfigurationExample/CMakeLists.txt +++ b/examples/cpp/dds/BasicConfigurationExample/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -46,6 +46,6 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE $<$:SHM_TRANSPORT_BUILTIN> # Enable SHM as built-in transport ) -target_link_libraries(${PROJECT_NAME} fastrtps fastcdr fastdds::optionparser) +target_link_libraries(${PROJECT_NAME} fastdds fastcdr fastdds::optionparser) install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION examples/cpp/dds/${PROJECT_NAME}/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/BasicConfigurationExample/README.md b/examples/cpp/dds/BasicConfigurationExample/README.md index 02f3c1a7ef9..a95ef86a3f9 100644 --- a/examples/cpp/dds/BasicConfigurationExample/README.md +++ b/examples/cpp/dds/BasicConfigurationExample/README.md @@ -66,7 +66,7 @@ QoS options: Discovery options: --ttl Set multicast discovery Time To Live on IPv4 or Hop Limit - for IPv6. If not set, uses Fast-DDS default (1 hop). + for IPv6. If not set, uses Fast DDS default (1 hop). Increase it to avoid discovery issues on scenarios with several routers. Maximum: 255. ``` diff --git a/examples/cpp/dds/BasicConfigurationExample/arg_configuration.h b/examples/cpp/dds/BasicConfigurationExample/arg_configuration.h index 84d58fd68b3..2d8154fcdb1 100644 --- a/examples/cpp/dds/BasicConfigurationExample/arg_configuration.h +++ b/examples/cpp/dds/BasicConfigurationExample/arg_configuration.h @@ -220,7 +220,7 @@ const option::Descriptor usage[] = { { UNKNOWN_OPT, 0, "", "", Arg::None, "\nDiscovery options:"}, { TTL, 0, "", "ttl", Arg::NumericRange<1, 255>, "\t--ttl \tSet multicast discovery Time To Live on IPv4 or Hop Limit for IPv6." - " If not set, uses Fast-DDS default (1 hop). Increase it to avoid discovery issues" + " If not set, uses Fast DDS default (1 hop). Increase it to avoid discovery issues" " on scenarios with several routers. Maximum: 255."}, { 0, 0, 0, 0, 0, 0 } diff --git a/examples/cpp/dds/Configurability/CMakeLists.txt b/examples/cpp/dds/Configurability/CMakeLists.txt index 3be7f877c7d..d86f271d8c7 100644 --- a/examples/cpp/dds/Configurability/CMakeLists.txt +++ b/examples/cpp/dds/Configurability/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -47,7 +47,7 @@ target_compile_definitions(DDSConfigurabilityPublisher PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSConfigurabilityPublisher fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSConfigurabilityPublisher fastdds fastcdr foonathan_memory) install(TARGETS DDSConfigurabilityPublisher RUNTIME DESTINATION examples/cpp/dds/Configurability/${BIN_INSTALL_DIR} ) @@ -57,7 +57,7 @@ target_compile_definitions(DDSConfigurabilitySubscriber PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSConfigurabilitySubscriber fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSConfigurabilitySubscriber fastdds fastcdr foonathan_memory) install(TARGETS DDSConfigurabilitySubscriber RUNTIME DESTINATION examples/cpp/dds/Configurability/${BIN_INSTALL_DIR} ) diff --git a/examples/cpp/dds/Configurability/ConfigurabilityPublisher.cpp b/examples/cpp/dds/Configurability/ConfigurabilityPublisher.cpp index 608ad437ec7..26b13df5869 100644 --- a/examples/cpp/dds/Configurability/ConfigurabilityPublisher.cpp +++ b/examples/cpp/dds/Configurability/ConfigurabilityPublisher.cpp @@ -1,8 +1,8 @@ /*** - * Use Case Demonstrator for eProsima Fast RTPS + * Use Case Demonstrator for eProsima Fast DDS * -------------------------------------------- * - * This is an interactive program designed to show the effect of different configuration parameters on the behaviour of eProsima Fast RTPS + * This is an interactive program designed to show the effect of different configuration parameters on the behaviour of eProsima Fast DDS * ***/ diff --git a/examples/cpp/dds/Configurability/ConfigurabilitySubscriber.cpp b/examples/cpp/dds/Configurability/ConfigurabilitySubscriber.cpp index 6c5f7702357..e00ad10e226 100644 --- a/examples/cpp/dds/Configurability/ConfigurabilitySubscriber.cpp +++ b/examples/cpp/dds/Configurability/ConfigurabilitySubscriber.cpp @@ -1,8 +1,8 @@ /*** - * Use Case Demonstrator for eProsima Fast RTPS + * Use Case Demonstrator for eProsima Fast DDS * -------------------------------------------- * - * This is an interactive program designed to show the effect of different configuration parameters on the behaviour of eProsima Fast RTPS + * This is an interactive program designed to show the effect of different configuration parameters on the behaviour of eProsima Fast DDS * ***/ diff --git a/examples/cpp/dds/ContentFilteredTopicExample/CMakeLists.txt b/examples/cpp/dds/ContentFilteredTopicExample/CMakeLists.txt index abbbc4f3c0d..c245ed3d8fb 100644 --- a/examples/cpp/dds/ContentFilteredTopicExample/CMakeLists.txt +++ b/examples/cpp/dds/ContentFilteredTopicExample/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() message(STATUS "Configuring ContentFilterTopic examples...") @@ -43,6 +43,6 @@ target_compile_definitions(DDSContentFilteredTopicExample PRIVATE $<$:__INTERNALDEBUG> # Internal debug activated. ) target_compile_features(DDSContentFilteredTopicExample PRIVATE cxx_std_11) -target_link_libraries(DDSContentFilteredTopicExample fastrtps fastcdr fastdds::optionparser) +target_link_libraries(DDSContentFilteredTopicExample fastdds fastcdr fastdds::optionparser) install(TARGETS DDSContentFilteredTopicExample RUNTIME DESTINATION examples/cpp/dds/ContentFilteredTopicExample/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/CustomListenerExample/CMakeLists.txt b/examples/cpp/dds/CustomListenerExample/CMakeLists.txt index 8a9d42515a1..ef062af7ab7 100644 --- a/examples/cpp/dds/CustomListenerExample/CMakeLists.txt +++ b/examples/cpp/dds/CustomListenerExample/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() # Check C++11 @@ -44,6 +44,6 @@ target_compile_definitions(DDSCustomListenerExample PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSCustomListenerExample fastrtps fastcdr) +target_link_libraries(DDSCustomListenerExample fastdds fastcdr) install(TARGETS DDSCustomListenerExample RUNTIME DESTINATION examples/cpp/dds/CustomListenerExample/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/CustomListenerExample/CustomListenerPublisher.cpp b/examples/cpp/dds/CustomListenerExample/CustomListenerPublisher.cpp index f8414ce90dc..b2fa6762663 100644 --- a/examples/cpp/dds/CustomListenerExample/CustomListenerPublisher.cpp +++ b/examples/cpp/dds/CustomListenerExample/CustomListenerPublisher.cpp @@ -18,15 +18,14 @@ */ #include "CustomListenerPublisher.h" -#include -#include + +#include + #include -#include -#include #include +#include #include - -#include +#include using namespace eprosima::fastdds::dds; diff --git a/examples/cpp/dds/CustomListenerExample/CustomListenerSubscriber.cpp b/examples/cpp/dds/CustomListenerExample/CustomListenerSubscriber.cpp index bd685482f66..b3940eafef0 100644 --- a/examples/cpp/dds/CustomListenerExample/CustomListenerSubscriber.cpp +++ b/examples/cpp/dds/CustomListenerExample/CustomListenerSubscriber.cpp @@ -18,15 +18,14 @@ */ #include "CustomListenerSubscriber.h" -#include -#include + +#include + #include -#include #include -#include #include - -#include +#include +#include using namespace eprosima::fastdds::dds; diff --git a/examples/cpp/dds/CustomListenerExample/CustomListenerSubscriber.h b/examples/cpp/dds/CustomListenerExample/CustomListenerSubscriber.h index 6c3cbf44830..d5a31f44bd8 100644 --- a/examples/cpp/dds/CustomListenerExample/CustomListenerSubscriber.h +++ b/examples/cpp/dds/CustomListenerExample/CustomListenerSubscriber.h @@ -20,13 +20,13 @@ #ifndef CUSTOMLISTENERSUBSCRIBER_H_ #define CUSTOMLISTENERSUBSCRIBER_H_ -#include "TopicPubSubTypes.h" -#include "CustomListeners.h" - +#include #include #include -#include -#include +#include + +#include "CustomListeners.h" +#include "TopicPubSubTypes.h" class CustomListenerSubscriber { diff --git a/examples/cpp/dds/CustomListenerExample/CustomListener_main.cpp b/examples/cpp/dds/CustomListenerExample/CustomListener_main.cpp index c38282a8de4..907a44b5835 100644 --- a/examples/cpp/dds/CustomListenerExample/CustomListener_main.cpp +++ b/examples/cpp/dds/CustomListenerExample/CustomListener_main.cpp @@ -17,15 +17,13 @@ * */ +#include +#include + #include "CustomListenerPublisher.h" #include "CustomListenerSubscriber.h" #include "CustomListeners.h" - -#include - -#include - using eprosima::fastdds::dds::Log; int main( diff --git a/examples/cpp/dds/CustomListenerExample/CustomListeners.cpp b/examples/cpp/dds/CustomListenerExample/CustomListeners.cpp index b18b4dbf3bd..6aaf72a9325 100644 --- a/examples/cpp/dds/CustomListenerExample/CustomListeners.cpp +++ b/examples/cpp/dds/CustomListenerExample/CustomListeners.cpp @@ -18,25 +18,21 @@ */ #include "CustomListeners.h" -#include -#include -#include -#include -#include -#include -#include +#include -#include -#include +#include #include +#include #include - -#include +#include +#include +#include +#include +#include using namespace eprosima::fastdds::dds; - void CustomDataWriterListener::on_publication_matched( DataWriter*, const PublicationMatchedStatus& info) diff --git a/examples/cpp/dds/CustomListenerExample/CustomListeners.h b/examples/cpp/dds/CustomListenerExample/CustomListeners.h index 701bfdb2079..12ef7c514ff 100644 --- a/examples/cpp/dds/CustomListenerExample/CustomListeners.h +++ b/examples/cpp/dds/CustomListenerExample/CustomListeners.h @@ -20,24 +20,18 @@ #ifndef CUSTOMLISTENERS_H_ #define CUSTOMLISTENERS_H_ -#include "TopicPubSubTypes.h" - -#include -#include -#include +#include #include - +#include +#include #include - +#include +#include #include +#include +#include -#include -#include -#include - -#include -#include - +#include "TopicPubSubTypes.h" class CustomDataWriterListener : public eprosima::fastdds::dds::DataWriterListener { diff --git a/examples/cpp/dds/CustomPayloadPoolExample/CMakeLists.txt b/examples/cpp/dds/CustomPayloadPoolExample/CMakeLists.txt index 1b61ca13b7e..adecbdaeb26 100644 --- a/examples/cpp/dds/CustomPayloadPoolExample/CMakeLists.txt +++ b/examples/cpp/dds/CustomPayloadPoolExample/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -43,6 +43,6 @@ target_compile_definitions(CustomPayloadPoolExample PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(CustomPayloadPoolExample fastrtps fastcdr fastdds::optionparser) +target_link_libraries(CustomPayloadPoolExample fastdds fastcdr fastdds::optionparser) install(TARGETS CustomPayloadPoolExample RUNTIME DESTINATION examples/cpp/dds/CustomPayloadPoolExample/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPoolDataPublisher.cpp b/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPoolDataPublisher.cpp index 866a7364bc4..4fa276efbfb 100644 --- a/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPoolDataPublisher.cpp +++ b/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPoolDataPublisher.cpp @@ -17,19 +17,16 @@ * */ -#include -#include - #include "CustomPayloadPoolDataPublisher.h" +#include +#include + #include #include +#include #include #include -#include -#include -#include - using namespace eprosima::fastdds::dds; using namespace eprosima::fastdds::rtps; diff --git a/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPoolDataSubscriber.cpp b/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPoolDataSubscriber.cpp index 5dc610964ac..b78051cd264 100644 --- a/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPoolDataSubscriber.cpp +++ b/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPoolDataSubscriber.cpp @@ -17,17 +17,15 @@ * */ -#include - #include "CustomPayloadPoolDataSubscriber.h" +#include + #include -#include #include +#include #include #include -#include -#include using namespace eprosima::fastdds::dds; diff --git a/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPoolDataSubscriber.h b/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPoolDataSubscriber.h index ab1ab59039d..7179f216fba 100644 --- a/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPoolDataSubscriber.h +++ b/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPoolDataSubscriber.h @@ -23,13 +23,13 @@ #include #include -#include "CustomPayloadPoolDataPubSubTypes.h" -#include "CustomPayloadPool.hpp" - #include #include #include -#include +#include + +#include "CustomPayloadPool.hpp" +#include "CustomPayloadPoolDataPubSubTypes.h" class CustomPayloadPoolDataSubscriber : private eprosima::fastdds::dds::DataReaderListener { diff --git a/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPool_main.cpp b/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPool_main.cpp index da78c8a224c..fd9f9db33ab 100644 --- a/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPool_main.cpp +++ b/examples/cpp/dds/CustomPayloadPoolExample/CustomPayloadPool_main.cpp @@ -20,14 +20,13 @@ #include #include -#include "CustomPayloadPoolDataPublisher.h" -#include "CustomPayloadPoolDataSubscriber.h" - #include -#include - +#include #include +#include "CustomPayloadPoolDataPublisher.h" +#include "CustomPayloadPoolDataSubscriber.h" + using eprosima::fastdds::dds::Log; namespace option = eprosima::option; diff --git a/examples/cpp/dds/DeadlineQoSExample/CMakeLists.txt b/examples/cpp/dds/DeadlineQoSExample/CMakeLists.txt index 4a5f3ba2af1..3713e6e2b83 100644 --- a/examples/cpp/dds/DeadlineQoSExample/CMakeLists.txt +++ b/examples/cpp/dds/DeadlineQoSExample/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(DDSDeadlineQoSExample PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSDeadlineQoSExample fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSDeadlineQoSExample fastdds fastcdr foonathan_memory) if(UNIX AND NOT(QNXNTO) AND NOT(ANDROID)) target_link_libraries(DDSDeadlineQoSExample pthread) endif() diff --git a/examples/cpp/dds/DeadlineQoSExample/deadlinepayloadPubSubMain.cxx b/examples/cpp/dds/DeadlineQoSExample/deadlinepayloadPubSubMain.cxx index e47cbdda0c6..47f019ba6ff 100644 --- a/examples/cpp/dds/DeadlineQoSExample/deadlinepayloadPubSubMain.cxx +++ b/examples/cpp/dds/DeadlineQoSExample/deadlinepayloadPubSubMain.cxx @@ -15,10 +15,6 @@ #include "deadlinepayloadPublisher.h" #include "deadlinepayloadSubscriber.h" - -#include -#include - using namespace eprosima; using namespace eprosima::fastrtps; diff --git a/examples/cpp/dds/DeadlineQoSExample/deadlinepayloadSubscriber.h b/examples/cpp/dds/DeadlineQoSExample/deadlinepayloadSubscriber.h index d65f44d76cd..bda26f3e921 100644 --- a/examples/cpp/dds/DeadlineQoSExample/deadlinepayloadSubscriber.h +++ b/examples/cpp/dds/DeadlineQoSExample/deadlinepayloadSubscriber.h @@ -24,15 +24,13 @@ #define _DEADLINEPAYLOAD_SUBSCRIBER_H_ #include -#include #include #include +#include #include #include "deadlinepayloadPubSubTypes.h" -#include "mapableKey.h" - class deadlinepayloadSubscriber { public: diff --git a/examples/cpp/dds/DeadlineQoSExample/mapableKey.h b/examples/cpp/dds/DeadlineQoSExample/mapableKey.h deleted file mode 100644 index 4b34b059f79..00000000000 --- a/examples/cpp/dds/DeadlineQoSExample/mapableKey.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef MAPABLEKEY_H_ -#define MAPABLEKEY_H_ - -#include -#include -#include -#include - -#include - -typedef struct ex_mapableKey -{ - - eprosima::fastrtps::rtps::octet value[16]; - - ex_mapableKey& operator =( - const eprosima::fastrtps::rtps::InstanceHandle_t& ihandle) - { - for (uint8_t i = 0; i < 16; i++) - { - value[i] = ihandle.value[i]; - } - return *this; - } - -}mapable_key; - -inline bool operator <( - const ex_mapableKey& ex_mapableKey1, - const ex_mapableKey& ex_mapableKey2) -{ - for (uint8_t i = 0; i < 16; ++i) - { - if (ex_mapableKey1.value[i] < ex_mapableKey2.value[i]) - { - return true; - } - } - return false; -} - -#endif // ifndef MAPABLEKEY_H_ diff --git a/examples/cpp/dds/DisablePositiveACKs/CMakeLists.txt b/examples/cpp/dds/DisablePositiveACKs/CMakeLists.txt index 3dc4e941b59..8ad0336e19a 100644 --- a/examples/cpp/dds/DisablePositiveACKs/CMakeLists.txt +++ b/examples/cpp/dds/DisablePositiveACKs/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -44,6 +44,6 @@ target_compile_definitions(DDSDisablePositiveACKs PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSDisablePositiveACKs fastrtps fastcdr) +target_link_libraries(DDSDisablePositiveACKs fastdds fastcdr) install(TARGETS DDSDisablePositiveACKs RUNTIME DESTINATION examples/cpp/dds/DisablePositiveACKs/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/DisablePositiveACKs/DisablePositiveACKS_main.cpp b/examples/cpp/dds/DisablePositiveACKs/DisablePositiveACKS_main.cpp index e4afc17ea12..3ec4fe51f69 100644 --- a/examples/cpp/dds/DisablePositiveACKs/DisablePositiveACKS_main.cpp +++ b/examples/cpp/dds/DisablePositiveACKs/DisablePositiveACKS_main.cpp @@ -20,13 +20,14 @@ #include "DisablePositiveACKsPublisher.h" #include "DisablePositiveACKsSubscriber.h" -#include -#include +#include using namespace eprosima; using namespace fastrtps; using namespace rtps; +using namespace eprosima::fastdds::dds; + /** * @brief Parses command line arguments * @param argc Number of command line arguments @@ -182,7 +183,6 @@ int main( break; } } - Domain::stopAll(); Log::Reset(); return 0; } diff --git a/examples/cpp/dds/DiscoveryServerExample/CMakeLists.txt b/examples/cpp/dds/DiscoveryServerExample/CMakeLists.txt index 5c09eaaad0f..035ff741189 100644 --- a/examples/cpp/dds/DiscoveryServerExample/CMakeLists.txt +++ b/examples/cpp/dds/DiscoveryServerExample/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -44,6 +44,6 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(${PROJECT_NAME} fastrtps fastcdr fastdds::optionparser) +target_link_libraries(${PROJECT_NAME} fastdds fastcdr fastdds::optionparser) install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION examples/cpp/dds/${PROJECT_NAME}/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerPublisher.cpp b/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerPublisher.cpp index 32c6770f1a5..14feb51aa68 100644 --- a/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerPublisher.cpp +++ b/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerPublisher.cpp @@ -17,6 +17,8 @@ * */ +#include "DiscoveryServerPublisher.h" + #include #include @@ -30,12 +32,8 @@ #include #include #include -#include -#include #include -#include "DiscoveryServerPublisher.h" - using namespace eprosima::fastdds::dds; using namespace eprosima::fastdds::rtps; @@ -257,8 +255,10 @@ void HelloWorldPublisher::PubListener::on_publication_matched( void HelloWorldPublisher::PubListener::on_participant_discovery( eprosima::fastdds::dds::DomainParticipant* /*participant*/, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) { + static_cast(should_be_ignored); if (info.status == eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { std::cout << "Discovered Participant with GUID " << info.info.m_guid << std::endl; diff --git a/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerPublisher.h b/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerPublisher.h index 82bbfd6ee47..2ddb09baba9 100644 --- a/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerPublisher.h +++ b/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerPublisher.h @@ -101,7 +101,8 @@ class HelloWorldPublisher //! Callback executed when a DomainParticipant is discovered, dropped or removed void on_participant_discovery( eprosima::fastdds::dds::DomainParticipant* /*participant*/, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) override; + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override; private: diff --git a/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerServer.cpp b/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerServer.cpp index 7b71826790d..4992b318014 100644 --- a/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerServer.cpp +++ b/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerServer.cpp @@ -17,6 +17,8 @@ * */ +#include "DiscoveryServerServer.h" + #include #include #include @@ -24,13 +26,10 @@ #include #include -#include -#include #include #include -#include - -#include "DiscoveryServerServer.h" +#include +#include using namespace eprosima::fastdds::dds; using namespace eprosima::fastdds::rtps; @@ -251,8 +250,10 @@ DiscoveryServer::~DiscoveryServer() void DiscoveryServer::ServerListener::on_participant_discovery( eprosima::fastdds::dds::DomainParticipant* /*participant*/, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) { + static_cast(should_be_ignored); if (info.status == eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { std::cout << "Discovered Participant with GUID " << info.info.m_guid << std::endl; diff --git a/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerServer.h b/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerServer.h index 566dd904826..8b96f66a26f 100644 --- a/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerServer.h +++ b/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerServer.h @@ -83,7 +83,8 @@ class DiscoveryServer //! Callback executed when a DomainParticipant is discovered, dropped or removed void on_participant_discovery( eprosima::fastdds::dds::DomainParticipant* /*participant*/, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) override; + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override; private: diff --git a/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerSubscriber.cpp b/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerSubscriber.cpp index 9051bac5b5f..031221309c7 100644 --- a/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerSubscriber.cpp +++ b/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerSubscriber.cpp @@ -17,6 +17,8 @@ * */ +#include "DiscoveryServerSubscriber.h" + #include #include #include @@ -27,16 +29,12 @@ #include #include #include -#include -#include #include #include -#include -#include +#include +#include #include -#include "DiscoveryServerSubscriber.h" - using namespace eprosima::fastdds::dds; using namespace eprosima::fastdds::rtps; @@ -294,8 +292,10 @@ void HelloWorldSubscriber::SubListener::on_data_available( void HelloWorldSubscriber::SubListener::on_participant_discovery( eprosima::fastdds::dds::DomainParticipant* /*participant*/, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) { + static_cast(should_be_ignored); if (info.status == eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { std::cout << "Discovered Participant with GUID " << info.info.m_guid << std::endl; diff --git a/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerSubscriber.h b/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerSubscriber.h index 21cfed4832f..44e6066bd53 100644 --- a/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerSubscriber.h +++ b/examples/cpp/dds/DiscoveryServerExample/DiscoveryServerSubscriber.h @@ -108,7 +108,8 @@ class HelloWorldSubscriber //! Callback executed when a DomainParticipant is discovered, dropped or removed void on_participant_discovery( eprosima::fastdds::dds::DomainParticipant* /*participant*/, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) override; + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override; private: diff --git a/examples/cpp/dds/DynamicHelloWorldExample/CMakeLists.txt b/examples/cpp/dds/DynamicHelloWorldExample/CMakeLists.txt index b5b42c636a0..8e80ce0a115 100644 --- a/examples/cpp/dds/DynamicHelloWorldExample/CMakeLists.txt +++ b/examples/cpp/dds/DynamicHelloWorldExample/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(DDSDynamicHelloWorldExample PRIVATE $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSDynamicHelloWorldExample fastrtps fastcdr) +target_link_libraries(DDSDynamicHelloWorldExample fastdds fastcdr) install(TARGETS DDSDynamicHelloWorldExample RUNTIME DESTINATION examples/cpp/dds/DynamicHelloWorldExample/${BIN_INSTALL_DIR}) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/helloworld_example_type_profile.xml diff --git a/examples/cpp/dds/DynamicHelloWorldExample/HelloWorldPublisher.cpp b/examples/cpp/dds/DynamicHelloWorldExample/HelloWorldPublisher.cpp index 567653d7a30..d76b8a82707 100644 --- a/examples/cpp/dds/DynamicHelloWorldExample/HelloWorldPublisher.cpp +++ b/examples/cpp/dds/DynamicHelloWorldExample/HelloWorldPublisher.cpp @@ -18,20 +18,17 @@ */ #include "HelloWorldPublisher.h" -#include -#include -#include -#include + +#include + +#include #include +#include #include -#include - +#include #include - #include -#include - using namespace eprosima::fastdds::dds; HelloWorldPublisher::HelloWorldPublisher() diff --git a/examples/cpp/dds/DynamicHelloWorldExample/HelloWorldSubscriber.cpp b/examples/cpp/dds/DynamicHelloWorldExample/HelloWorldSubscriber.cpp index 753a1590e0d..3db235e694f 100644 --- a/examples/cpp/dds/DynamicHelloWorldExample/HelloWorldSubscriber.cpp +++ b/examples/cpp/dds/DynamicHelloWorldExample/HelloWorldSubscriber.cpp @@ -27,8 +27,6 @@ #include #include #include -#include -#include #include #include diff --git a/examples/cpp/dds/DynamicHelloWorldExample/HelloWorldSubscriber.h b/examples/cpp/dds/DynamicHelloWorldExample/HelloWorldSubscriber.h index fe10753b623..8b777392b48 100644 --- a/examples/cpp/dds/DynamicHelloWorldExample/HelloWorldSubscriber.h +++ b/examples/cpp/dds/DynamicHelloWorldExample/HelloWorldSubscriber.h @@ -20,22 +20,19 @@ #ifndef HELLOWORLDSUBSCRIBER_H_ #define HELLOWORLDSUBSCRIBER_H_ +#include +#include +#include + #include #include #include #include -#include -#include - +#include +#include #include #include -#include - -#include -#include -#include - class HelloWorldSubscriber { public: @@ -69,8 +66,6 @@ class HelloWorldSubscriber std::map datas_; - eprosima::fastrtps::SubscriberAttributes att_; - eprosima::fastdds::dds::DataReaderQos qos_; public: diff --git a/examples/cpp/dds/DynamicHelloWorldExample/HelloWorld_main.cpp b/examples/cpp/dds/DynamicHelloWorldExample/HelloWorld_main.cpp index a880dcd6067..582908edb44 100644 --- a/examples/cpp/dds/DynamicHelloWorldExample/HelloWorld_main.cpp +++ b/examples/cpp/dds/DynamicHelloWorldExample/HelloWorld_main.cpp @@ -20,7 +20,7 @@ #include "HelloWorldPublisher.h" #include "HelloWorldSubscriber.h" -#include +#include using eprosima::fastdds::dds::Log; diff --git a/examples/cpp/dds/DynamicHelloWorldExample/helloworld_example_type_profile.xml b/examples/cpp/dds/DynamicHelloWorldExample/helloworld_example_type_profile.xml index 1cb261cde23..4fa748f4973 100644 --- a/examples/cpp/dds/DynamicHelloWorldExample/helloworld_example_type_profile.xml +++ b/examples/cpp/dds/DynamicHelloWorldExample/helloworld_example_type_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/examples/cpp/dds/Filtering/CMakeLists.txt b/examples/cpp/dds/Filtering/CMakeLists.txt index 3255936b8d4..45a34aa0889 100644 --- a/examples/cpp/dds/Filtering/CMakeLists.txt +++ b/examples/cpp/dds/Filtering/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -47,7 +47,7 @@ target_compile_definitions(DDSFiltering PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSFiltering fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSFiltering fastdds fastcdr foonathan_memory) install(TARGETS DDSFiltering RUNTIME DESTINATION examples/cpp/dds/Filtering/${BIN_INSTALL_DIR} ) diff --git a/examples/cpp/dds/Filtering/FilteringExamplePubSubMain.cxx b/examples/cpp/dds/Filtering/FilteringExamplePubSubMain.cxx index 51229191915..0da1061846b 100644 --- a/examples/cpp/dds/Filtering/FilteringExamplePubSubMain.cxx +++ b/examples/cpp/dds/Filtering/FilteringExamplePubSubMain.cxx @@ -15,10 +15,6 @@ #include "FilteringExamplePublisher.h" #include "FilteringExampleSubscriber.h" - -#include -#include - using namespace eprosima; using namespace eprosima::fastrtps; diff --git a/examples/cpp/dds/FlowControlExample/CMakeLists.txt b/examples/cpp/dds/FlowControlExample/CMakeLists.txt index e321364d0e4..09fddb094bf 100644 --- a/examples/cpp/dds/FlowControlExample/CMakeLists.txt +++ b/examples/cpp/dds/FlowControlExample/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -47,6 +47,6 @@ target_compile_definitions(DDSFlowControlExample PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSFlowControlExample fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSFlowControlExample fastdds fastcdr foonathan_memory) install(TARGETS DDSFlowControlExample RUNTIME DESTINATION examples/cpp/dds/FlowControlExample/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/FlowControlExample/FlowControlExamplePubSubMain.cxx b/examples/cpp/dds/FlowControlExample/FlowControlExamplePubSubMain.cxx index cf18ba9d55a..a696c5d9d0e 100644 --- a/examples/cpp/dds/FlowControlExample/FlowControlExamplePubSubMain.cxx +++ b/examples/cpp/dds/FlowControlExample/FlowControlExamplePubSubMain.cxx @@ -19,14 +19,9 @@ * This file was generated by the tool fastcdrgen. */ - #include "FlowControlExamplePublisher.h" #include "FlowControlExampleSubscriber.h" - -#include -#include - using namespace eprosima; using namespace eprosima::fastrtps; diff --git a/examples/cpp/dds/HelloWorldExample/CMakeLists.txt b/examples/cpp/dds/HelloWorldExample/CMakeLists.txt index 583847ee4f5..87fbf8dc2b4 100644 --- a/examples/cpp/dds/HelloWorldExample/CMakeLists.txt +++ b/examples/cpp/dds/HelloWorldExample/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -43,6 +43,6 @@ target_compile_definitions(DDSHelloWorldExample PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSHelloWorldExample fastrtps fastcdr fastdds::optionparser) +target_link_libraries(DDSHelloWorldExample fastdds fastcdr fastdds::optionparser) install(TARGETS DDSHelloWorldExample RUNTIME DESTINATION examples/cpp/dds/HelloWorldExample/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/HelloWorldExample/HelloWorldPublisher.cpp b/examples/cpp/dds/HelloWorldExample/HelloWorldPublisher.cpp index 86f3e0009f5..1a2bdfce472 100644 --- a/examples/cpp/dds/HelloWorldExample/HelloWorldPublisher.cpp +++ b/examples/cpp/dds/HelloWorldExample/HelloWorldPublisher.cpp @@ -18,15 +18,14 @@ */ #include "HelloWorldPublisher.h" -#include -#include + +#include + #include -#include -#include #include +#include #include - -#include +#include using namespace eprosima::fastdds::dds; diff --git a/examples/cpp/dds/HelloWorldExample/HelloWorldSubscriber.cpp b/examples/cpp/dds/HelloWorldExample/HelloWorldSubscriber.cpp index 6823a32f4e6..9c65d38ffcb 100644 --- a/examples/cpp/dds/HelloWorldExample/HelloWorldSubscriber.cpp +++ b/examples/cpp/dds/HelloWorldExample/HelloWorldSubscriber.cpp @@ -22,13 +22,11 @@ #include #include -#include -#include #include -#include #include -#include #include +#include +#include using namespace eprosima::fastdds::dds; diff --git a/examples/cpp/dds/HelloWorldExample/HelloWorldSubscriber.h b/examples/cpp/dds/HelloWorldExample/HelloWorldSubscriber.h index ecd897bd532..227198cf191 100644 --- a/examples/cpp/dds/HelloWorldExample/HelloWorldSubscriber.h +++ b/examples/cpp/dds/HelloWorldExample/HelloWorldSubscriber.h @@ -20,12 +20,12 @@ #ifndef HELLOWORLDSUBSCRIBER_H_ #define HELLOWORLDSUBSCRIBER_H_ -#include "HelloWorldPubSubTypes.h" - +#include #include #include -#include -#include +#include + +#include "HelloWorldPubSubTypes.h" class HelloWorldSubscriber { diff --git a/examples/cpp/dds/HelloWorldExample/HelloWorld_main.cpp b/examples/cpp/dds/HelloWorldExample/HelloWorld_main.cpp index 35870eb670f..7a6fb595f09 100644 --- a/examples/cpp/dds/HelloWorldExample/HelloWorld_main.cpp +++ b/examples/cpp/dds/HelloWorldExample/HelloWorld_main.cpp @@ -20,14 +20,13 @@ #include #include -#include "HelloWorldPublisher.h" -#include "HelloWorldSubscriber.h" - #include -#include - +#include #include +#include "HelloWorldPublisher.h" +#include "HelloWorldSubscriber.h" + using eprosima::fastdds::dds::Log; namespace option = eprosima::option; diff --git a/examples/cpp/dds/HelloWorldExample/README.txt b/examples/cpp/dds/HelloWorldExample/README.txt index 2055de76c58..6e02448ed83 100644 --- a/examples/cpp/dds/HelloWorldExample/README.txt +++ b/examples/cpp/dds/HelloWorldExample/README.txt @@ -4,12 +4,12 @@ In the first one launch: ./DDSHelloWorldExample publisher (or DDSHelloWorldExamp In the second one: ./DDSHelloWorldExample subscriber (or DDSHelloWorldExample.exe subscriber on windows). In order to use xml profiles (--env or shorcut -e cli flags): - - reference the xml profiles file setting the environment variable FASTRTPS_DEFAULT_PROFILES_FILE to its path. - - name it DEFAULT_FASTRTPS_PROFILES.xml and make sure the file is besides the DDSHelloWorldExample binary. + - reference the xml profiles file setting the environment variable FASTDDS_DEFAULT_PROFILES_FILE to its path. + - name it DEFAULT_FASTDDS_PROFILES.xml and make sure the file is besides the DDSHelloWorldExample binary. The profile loaded will be the mark as default one with the corresponding attribute. For example: - + Profiles example name diff --git a/examples/cpp/dds/HelloWorldExampleDataSharing/CMakeLists.txt b/examples/cpp/dds/HelloWorldExampleDataSharing/CMakeLists.txt index 424624e354d..63830c19c42 100644 --- a/examples/cpp/dds/HelloWorldExampleDataSharing/CMakeLists.txt +++ b/examples/cpp/dds/HelloWorldExampleDataSharing/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -41,6 +41,6 @@ file(GLOB DDS_HELLOWORLD_EXAMPLE_DATASHARING_SOURCES_CPP "*.cpp") add_executable(DDSHelloWorldExampleDataSharing ${DDS_HELLOWORLD_EXAMPLE_DATASHARING_SOURCES_CXX} ${DDS_HELLOWORLD_EXAMPLE_DATASHARING_SOURCES_CPP}) -target_link_libraries(DDSHelloWorldExampleDataSharing fastrtps fastcdr) +target_link_libraries(DDSHelloWorldExampleDataSharing fastdds fastcdr) install(TARGETS DDSHelloWorldExampleDataSharing RUNTIME DESTINATION examples/cpp/dds/HelloWorldExampleDataSharing/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorldPublisher.cpp b/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorldPublisher.cpp index d6410f39fbc..24b6a033e9e 100644 --- a/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorldPublisher.cpp +++ b/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorldPublisher.cpp @@ -18,15 +18,14 @@ */ #include "HelloWorldPublisher.h" -#include -#include + +#include + #include -#include -#include #include +#include #include - -#include +#include using namespace eprosima::fastdds::dds; diff --git a/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorldSubscriber.cpp b/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorldSubscriber.cpp index 4e0e1fa9c58..365f0934271 100644 --- a/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorldSubscriber.cpp +++ b/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorldSubscriber.cpp @@ -27,8 +27,6 @@ #include #include #include -#include -#include using namespace eprosima::fastdds::dds; diff --git a/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorldSubscriber.h b/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorldSubscriber.h index c2cd03b7ebc..4d700a8cab2 100644 --- a/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorldSubscriber.h +++ b/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorldSubscriber.h @@ -20,12 +20,12 @@ #ifndef HELLOWORLDSUBSCRIBER_H_ #define HELLOWORLDSUBSCRIBER_H_ -#include "HelloWorldPubSubTypes.h" - +#include #include #include -#include -#include +#include + +#include "HelloWorldPubSubTypes.h" class HelloWorldSubscriber { diff --git a/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorld_main.cpp b/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorld_main.cpp index 12bfa578b4d..f7ff24627db 100644 --- a/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorld_main.cpp +++ b/examples/cpp/dds/HelloWorldExampleDataSharing/HelloWorld_main.cpp @@ -17,12 +17,11 @@ * */ -#include "HelloWorldPublisher.h" -#include "HelloWorldSubscriber.h" - #include +#include -#include +#include "HelloWorldPublisher.h" +#include "HelloWorldSubscriber.h" using eprosima::fastdds::dds::Log; diff --git a/examples/cpp/dds/HelloWorldExampleSharedMem/CMakeLists.txt b/examples/cpp/dds/HelloWorldExampleSharedMem/CMakeLists.txt index d7d8d045222..057b67e1e89 100644 --- a/examples/cpp/dds/HelloWorldExampleSharedMem/CMakeLists.txt +++ b/examples/cpp/dds/HelloWorldExampleSharedMem/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -51,6 +51,6 @@ target_compile_definitions(DDSHelloWorldExampleSharedMem PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSHelloWorldExampleSharedMem fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSHelloWorldExampleSharedMem fastdds fastcdr foonathan_memory) install(TARGETS DDSHelloWorldExampleSharedMem RUNTIME DESTINATION examples/cpp/dds/HelloWorldExampleSharedMem/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/HelloWorldExampleSharedMem/HelloWorld_main.cpp b/examples/cpp/dds/HelloWorldExampleSharedMem/HelloWorld_main.cpp index 04339bba607..979be73bef1 100644 --- a/examples/cpp/dds/HelloWorldExampleSharedMem/HelloWorld_main.cpp +++ b/examples/cpp/dds/HelloWorldExampleSharedMem/HelloWorld_main.cpp @@ -17,17 +17,18 @@ * */ -#include "HelloWorldPublisher.h" -#include "HelloWorldSubscriber.h" - #include -#include -#include +#include + +#include "HelloWorldPublisher.h" +#include "HelloWorldSubscriber.h" using namespace eprosima; using namespace fastrtps; using namespace rtps; +using namespace eprosima::fastdds::dds; + int main( int argc, char** argv) @@ -112,7 +113,6 @@ int main( break; } } - Domain::stopAll(); Log::Reset(); return 0; } diff --git a/examples/cpp/dds/HelloWorldExampleTCP/CMakeLists.txt b/examples/cpp/dds/HelloWorldExampleTCP/CMakeLists.txt index e98a20ff119..28cc54d5d2f 100644 --- a/examples/cpp/dds/HelloWorldExampleTCP/CMakeLists.txt +++ b/examples/cpp/dds/HelloWorldExampleTCP/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -55,6 +55,6 @@ target_compile_definitions(DDSHelloWorldExampleTCP PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSHelloWorldExampleTCP fastrtps fastcdr foonathan_memory fastdds::optionparser) +target_link_libraries(DDSHelloWorldExampleTCP fastdds fastcdr foonathan_memory fastdds::optionparser) install(TARGETS DDSHelloWorldExampleTCP RUNTIME DESTINATION examples/cpp/dds/HelloWorldExampleTCP/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/HelloWorldExampleTCP/HelloWorld_main.cpp b/examples/cpp/dds/HelloWorldExampleTCP/HelloWorld_main.cpp index 94a00bf20c2..f1b1677e472 100644 --- a/examples/cpp/dds/HelloWorldExampleTCP/HelloWorld_main.cpp +++ b/examples/cpp/dds/HelloWorldExampleTCP/HelloWorld_main.cpp @@ -17,16 +17,13 @@ * */ -#include "HelloWorldPublisher.h" -#include "HelloWorldSubscriber.h" - -#include -#include - #include #include +#include "HelloWorldPublisher.h" +#include "HelloWorldSubscriber.h" + namespace option = eprosima::option; struct Arg : public option::Arg @@ -311,6 +308,5 @@ int main( break; } } - Domain::stopAll(); return 0; } diff --git a/examples/cpp/dds/HistoryKind/CMakeLists.txt b/examples/cpp/dds/HistoryKind/CMakeLists.txt index 9f6462776c9..217442c05fc 100644 --- a/examples/cpp/dds/HistoryKind/CMakeLists.txt +++ b/examples/cpp/dds/HistoryKind/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 2.12 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(DDSHistoryKind PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSHistoryKind fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSHistoryKind fastdds fastcdr foonathan_memory) install(TARGETS DDSHistoryKind RUNTIME DESTINATION examples/cpp/dds/HistoryKind/${BIN_INSTALL_DIR} ) diff --git a/examples/cpp/dds/Keys/CMakeLists.txt b/examples/cpp/dds/Keys/CMakeLists.txt index 2cb9c151b80..8bee7df7fa0 100644 --- a/examples/cpp/dds/Keys/CMakeLists.txt +++ b/examples/cpp/dds/Keys/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(DDSKeys PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSKeys fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSKeys fastdds fastcdr foonathan_memory) install(TARGETS DDSKeys RUNTIME DESTINATION examples/cpp/dds/Keys/${BIN_INSTALL_DIR} ) diff --git a/examples/cpp/dds/LateJoiners/CMakeLists.txt b/examples/cpp/dds/LateJoiners/CMakeLists.txt index fd683dc6d23..f289f626014 100644 --- a/examples/cpp/dds/LateJoiners/CMakeLists.txt +++ b/examples/cpp/dds/LateJoiners/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 2.12 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(DDSLateJoiners PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSLateJoiners fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSLateJoiners fastdds fastcdr foonathan_memory) install(TARGETS DDSLateJoiners RUNTIME DESTINATION examples/cpp/dds/LateJoiners/${BIN_INSTALL_DIR} ) diff --git a/examples/cpp/dds/LifespanQoSExample/CMakeLists.txt b/examples/cpp/dds/LifespanQoSExample/CMakeLists.txt index 0e9f9ce97d6..15146b63341 100644 --- a/examples/cpp/dds/LifespanQoSExample/CMakeLists.txt +++ b/examples/cpp/dds/LifespanQoSExample/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 2.12 REQUIRED) endif() #Check C++11 @@ -43,6 +43,6 @@ target_compile_definitions(DDSLifespanQoSExample PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSLifespanQoSExample fastrtps fastcdr) +target_link_libraries(DDSLifespanQoSExample fastdds fastcdr) install(TARGETS DDSLifespanQoSExample RUNTIME DESTINATION examples/cpp/dds/LifespanQoSExample/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/LifespanQoSExample/Lifespan_main.cpp b/examples/cpp/dds/LifespanQoSExample/Lifespan_main.cpp index e0d2e4a395f..8b50afb30ce 100644 --- a/examples/cpp/dds/LifespanQoSExample/Lifespan_main.cpp +++ b/examples/cpp/dds/LifespanQoSExample/Lifespan_main.cpp @@ -17,15 +17,16 @@ * */ +#include + #include "LifespanPublisher.h" #include "LifespanSubscriber.h" -#include -#include - using namespace eprosima; using namespace fastrtps; using namespace rtps; +using namespace eprosima::fastdds::dds; + int main( int argc, char** argv) @@ -104,7 +105,6 @@ int main( break; } } - Domain::stopAll(); Log::Reset(); return 0; } diff --git a/examples/cpp/dds/LivelinessQoS/CMakeLists.txt b/examples/cpp/dds/LivelinessQoS/CMakeLists.txt index 6e9a89e4de7..a49536c22b5 100644 --- a/examples/cpp/dds/LivelinessQoS/CMakeLists.txt +++ b/examples/cpp/dds/LivelinessQoS/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -43,6 +43,6 @@ target_compile_definitions(DDSLivelinessQoS PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSLivelinessQoS fastrtps fastcdr) +target_link_libraries(DDSLivelinessQoS fastdds fastcdr) install(TARGETS DDSLivelinessQoS RUNTIME DESTINATION examples/cpp/dds/LivelinessQoS/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/LivelinessQoS/LivelinessPublisher.h b/examples/cpp/dds/LivelinessQoS/LivelinessPublisher.h index 5efec3fec94..e98202b7033 100644 --- a/examples/cpp/dds/LivelinessQoS/LivelinessPublisher.h +++ b/examples/cpp/dds/LivelinessQoS/LivelinessPublisher.h @@ -20,16 +20,16 @@ #ifndef LivelinessPublisher_H_ #define LivelinessPublisher_H_ -#include "TopicPubSubTypes.h" -#include "Topic.h" +#include #include -#include #include #include +#include #include -#include +#include "Topic.h" +#include "TopicPubSubTypes.h" class LivelinessPublisher { @@ -43,7 +43,7 @@ class LivelinessPublisher //! Initialize bool init( - eprosima::fastrtps::LivelinessQosPolicyKind kind, + eprosima::fastdds::dds::LivelinessQosPolicyKind kind, int liveliness_ms); //! Publish a sample @@ -90,7 +90,7 @@ class LivelinessPublisher void on_liveliness_lost( eprosima::fastdds::dds::DataWriter* writer, - const eprosima::fastrtps::LivelinessLostStatus& status) override; + const eprosima::fastdds::dds::LivelinessLostStatus& status) override; int n_matched; diff --git a/examples/cpp/dds/LivelinessQoS/LivelinessSubscriber.cpp b/examples/cpp/dds/LivelinessQoS/LivelinessSubscriber.cpp index 6e94d9570e6..816db593b5a 100644 --- a/examples/cpp/dds/LivelinessQoS/LivelinessSubscriber.cpp +++ b/examples/cpp/dds/LivelinessQoS/LivelinessSubscriber.cpp @@ -182,8 +182,10 @@ void LivelinessSubscriber::run( void LivelinessSubscriber::PartListener::on_participant_discovery( DomainParticipant*, - ParticipantDiscoveryInfo&& info) + ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) { + static_cast(should_be_ignored); if (info.status == ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { std::cout << "Participant discovered" << std::endl; diff --git a/examples/cpp/dds/LivelinessQoS/LivelinessSubscriber.h b/examples/cpp/dds/LivelinessQoS/LivelinessSubscriber.h index 154decdf689..5f10a008e11 100644 --- a/examples/cpp/dds/LivelinessQoS/LivelinessSubscriber.h +++ b/examples/cpp/dds/LivelinessQoS/LivelinessSubscriber.h @@ -20,17 +20,17 @@ #ifndef LIVELINESSSUBSCRIBER_H_ #define LIVELINESSSUBSCRIBER_H_ -#include "TopicPubSubTypes.h" -#include "Topic.h" - #include #include -#include #include #include +#include #include #include +#include "TopicPubSubTypes.h" +#include "Topic.h" + class LivelinessSubscriber { public: @@ -43,7 +43,7 @@ class LivelinessSubscriber //! Initialize the subscriber bool init( - eprosima::fastrtps::LivelinessQosPolicyKind kind, + eprosima::fastdds::dds::LivelinessQosPolicyKind kind, int liveliness_ms); //! RUN the subscriber @@ -105,7 +105,8 @@ class LivelinessSubscriber virtual void on_participant_discovery( eprosima::fastdds::dds::DomainParticipant* participant, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) override; + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override; private: diff --git a/examples/cpp/dds/LivelinessQoS/Liveliness_main.cpp b/examples/cpp/dds/LivelinessQoS/Liveliness_main.cpp index 2c3c28f0514..93ece7e9990 100644 --- a/examples/cpp/dds/LivelinessQoS/Liveliness_main.cpp +++ b/examples/cpp/dds/LivelinessQoS/Liveliness_main.cpp @@ -17,16 +17,16 @@ * */ +#include +#include + #include "LivelinessPublisher.h" #include "LivelinessSubscriber.h" -#include -#include -#include - using namespace eprosima; using namespace fastrtps; using namespace rtps; +using namespace eprosima::fastdds::dds; //! //! \brief Parses command line artuments @@ -57,7 +57,7 @@ int main( int sleep_ms = 1000; int count = 10; - eprosima::fastrtps::LivelinessQosPolicyKind kind = eprosima::fastrtps::AUTOMATIC_LIVELINESS_QOS; + LivelinessQosPolicyKind kind = LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS; if (!parse_arguments( argc, @@ -109,7 +109,6 @@ int main( break; } } - Domain::stopAll(); Log::Reset(); return 0; } @@ -119,7 +118,7 @@ bool parse_arguments( char** argv, int& type, int& lease_duration_ms, - eprosima::fastrtps::LivelinessQosPolicyKind& kind, + LivelinessQosPolicyKind& kind, int& sleep_ms, int& samples) { @@ -153,15 +152,15 @@ bool parse_arguments( { if (!strcmp(argv[count + 1], "AUTOMATIC")) { - kind = eprosima::fastrtps::LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS; + kind = LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS; } else if (!strcmp(argv[count + 1], "MANUAL_BY_PARTICIPANT")) { - kind = eprosima::fastrtps::LivelinessQosPolicyKind::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS; + kind = LivelinessQosPolicyKind::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS; } else if (!strcmp(argv[count + 1], "MANUAL_BY_TOPIC")) { - kind = eprosima::fastrtps::LivelinessQosPolicyKind::MANUAL_BY_TOPIC_LIVELINESS_QOS; + kind = LivelinessQosPolicyKind::MANUAL_BY_TOPIC_LIVELINESS_QOS; } else { @@ -201,15 +200,15 @@ bool parse_arguments( { if (!strcmp(argv[count + 1], "AUTOMATIC")) { - kind = eprosima::fastrtps::LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS; + kind = LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS; } else if (!strcmp(argv[count + 1], "MANUAL_BY_PARTICIPANT")) { - kind = eprosima::fastrtps::LivelinessQosPolicyKind::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS; + kind = LivelinessQosPolicyKind::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS; } else if (!strcmp(argv[count + 1], "MANUAL_BY_TOPIC")) { - kind = eprosima::fastrtps::LivelinessQosPolicyKind::MANUAL_BY_TOPIC_LIVELINESS_QOS; + kind = LivelinessQosPolicyKind::MANUAL_BY_TOPIC_LIVELINESS_QOS; } else { diff --git a/examples/cpp/dds/OwnershipStrengthQoSExample/CMakeLists.txt b/examples/cpp/dds/OwnershipStrengthQoSExample/CMakeLists.txt index f26d31984dd..4f77e0747a9 100644 --- a/examples/cpp/dds/OwnershipStrengthQoSExample/CMakeLists.txt +++ b/examples/cpp/dds/OwnershipStrengthQoSExample/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(DDSOwnershipStrengthQoSExample PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSOwnershipStrengthQoSExample fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSOwnershipStrengthQoSExample fastdds fastcdr foonathan_memory) install(TARGETS DDSOwnershipStrengthQoSExample RUNTIME DESTINATION examples/cpp/dds/OwnershipStrengthQoSExample/${BIN_INSTALL_DIR} ) diff --git a/examples/cpp/dds/OwnershipStrengthQoSExample/OwnershipStrengthPubSubMain.cxx b/examples/cpp/dds/OwnershipStrengthQoSExample/OwnershipStrengthPubSubMain.cxx index 454d3b1dca3..73749ab9a04 100644 --- a/examples/cpp/dds/OwnershipStrengthQoSExample/OwnershipStrengthPubSubMain.cxx +++ b/examples/cpp/dds/OwnershipStrengthQoSExample/OwnershipStrengthPubSubMain.cxx @@ -19,16 +19,16 @@ * This file was generated by the tool fastcdrgen. */ -#include "OwnershipStrengthPublisher.h" -#include "OwnershipStrengthSubscriber.h" +#include +#include -#include -#include -#include +#include "OwnershipStrengthPublisher.h" +#include "OwnershipStrengthSubscriber.h" using namespace eprosima; using namespace eprosima::fastrtps; +using namespace eprosima::fastdds::dds; int main(int argc, char** argv) { diff --git a/examples/cpp/dds/OwnershipStrengthQoSExample/OwnershipStrengthSubscriber.cxx b/examples/cpp/dds/OwnershipStrengthQoSExample/OwnershipStrengthSubscriber.cxx index 32fa0d9193d..96ff1b66d07 100644 --- a/examples/cpp/dds/OwnershipStrengthQoSExample/OwnershipStrengthSubscriber.cxx +++ b/examples/cpp/dds/OwnershipStrengthQoSExample/OwnershipStrengthSubscriber.cxx @@ -90,7 +90,7 @@ bool OwnershipStrengthSubscriber::init() //Create DataReader DataReaderQos rqos; - rqos.reliability().kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + rqos.reliability().kind = ReliabilityQosPolicyKind::RELIABLE_RELIABILITY_QOS; reader_ = subscriber_->create_datareader(topic_, rqos, &m_listener); diff --git a/examples/cpp/dds/RequestReplyExample/CMakeLists.txt b/examples/cpp/dds/RequestReplyExample/CMakeLists.txt index 654db9d07b6..4dcb45ea8c4 100644 --- a/examples/cpp/dds/RequestReplyExample/CMakeLists.txt +++ b/examples/cpp/dds/RequestReplyExample/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -55,7 +55,7 @@ target_compile_definitions(DDSCalculatorClient PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSCalculatorClient fastrtps fastcdr) +target_link_libraries(DDSCalculatorClient fastdds fastcdr) install(TARGETS DDSCalculatorClient RUNTIME DESTINATION examples/cpp/dds/RequestReplyExample/${BIN_INSTALL_DIR}) @@ -67,6 +67,6 @@ target_compile_definitions(DDSCalculatorServer PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSCalculatorServer fastrtps fastcdr) +target_link_libraries(DDSCalculatorServer fastdds fastcdr) install(TARGETS DDSCalculatorServer RUNTIME DESTINATION examples/cpp/dds/RequestReplyExample/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/RequestReplyExample/CalculatorClient.cpp b/examples/cpp/dds/RequestReplyExample/CalculatorClient.cpp index b5a56e12735..3c6aa796f9a 100644 --- a/examples/cpp/dds/RequestReplyExample/CalculatorClient.cpp +++ b/examples/cpp/dds/RequestReplyExample/CalculatorClient.cpp @@ -16,13 +16,14 @@ #include #include -#include #include -#include +#include #include -#include +#include #include -#include +#include +#include + #include "CalculatorPubSubTypes.h" class CalculatorClient diff --git a/examples/cpp/dds/RequestReplyExample/CalculatorServer.cpp b/examples/cpp/dds/RequestReplyExample/CalculatorServer.cpp index 4a9df742374..59f933e5c96 100644 --- a/examples/cpp/dds/RequestReplyExample/CalculatorServer.cpp +++ b/examples/cpp/dds/RequestReplyExample/CalculatorServer.cpp @@ -16,13 +16,14 @@ #include #include -#include #include -#include +#include #include -#include +#include #include -#include +#include +#include + #include "CalculatorPubSubTypes.h" class CalculatorServer diff --git a/examples/cpp/dds/SampleConfig_Controller/CMakeLists.txt b/examples/cpp/dds/SampleConfig_Controller/CMakeLists.txt index b806afaca8a..bfe106ab4a3 100644 --- a/examples/cpp/dds/SampleConfig_Controller/CMakeLists.txt +++ b/examples/cpp/dds/SampleConfig_Controller/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(DDSSampleConfig_Controller PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSSampleConfig_Controller fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSSampleConfig_Controller fastdds fastcdr foonathan_memory) install(TARGETS DDSSampleConfig_Controller RUNTIME DESTINATION examples/cpp/dds/SampleConfig_Controller/${BIN_INSTALL_DIR} ) diff --git a/examples/cpp/dds/SampleConfig_Events/CMakeLists.txt b/examples/cpp/dds/SampleConfig_Events/CMakeLists.txt index 58ce865c015..b13077c1140 100644 --- a/examples/cpp/dds/SampleConfig_Events/CMakeLists.txt +++ b/examples/cpp/dds/SampleConfig_Events/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(DDSSampleConfig_Events PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSSampleConfig_Events fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSSampleConfig_Events fastdds fastcdr foonathan_memory) install(TARGETS DDSSampleConfig_Events RUNTIME DESTINATION examples/cpp/dds/SampleConfig_Events/${BIN_INSTALL_DIR} ) diff --git a/examples/cpp/dds/SampleConfig_Events/README.txt b/examples/cpp/dds/SampleConfig_Events/README.txt index 885f13760b3..57515f0c7b0 100644 --- a/examples/cpp/dds/SampleConfig_Events/README.txt +++ b/examples/cpp/dds/SampleConfig_Events/README.txt @@ -80,7 +80,7 @@ Audio and Video transmission have a common characteristic: Having a stable, high - Distributed measurement: Controllers -Lets say we have a factory with a network of distributed temperature sensors and we want to use eProsima Fast RTPS to send data from said sensors to an automation computer which +Lets say we have a factory with a network of distributed temperature sensors and we want to use eProsima Fast DDS to send data from said sensors to an automation computer which makes decisions based on the temperature distribution. We would group all sensors within one single topic, Reliability: Reliable. We want to make sure samples are not lost. Furthermore, since reliable more ensures data delivery, it allows us to detect hardware problems when a sensor becomes silent diff --git a/examples/cpp/dds/SampleConfig_Multimedia/CMakeLists.txt b/examples/cpp/dds/SampleConfig_Multimedia/CMakeLists.txt index 19862018d38..22d59bfdaac 100644 --- a/examples/cpp/dds/SampleConfig_Multimedia/CMakeLists.txt +++ b/examples/cpp/dds/SampleConfig_Multimedia/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(DDSSampleConfig_Multimedia PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSSampleConfig_Multimedia fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSSampleConfig_Multimedia fastdds fastcdr foonathan_memory) install(TARGETS DDSSampleConfig_Multimedia RUNTIME DESTINATION examples/cpp/dds/SampleConfig_Multimedia/${BIN_INSTALL_DIR} ) diff --git a/examples/cpp/dds/SampleConfig_Multimedia/README.txt b/examples/cpp/dds/SampleConfig_Multimedia/README.txt index 59c6346b9cf..542a16db64f 100644 --- a/examples/cpp/dds/SampleConfig_Multimedia/README.txt +++ b/examples/cpp/dds/SampleConfig_Multimedia/README.txt @@ -80,7 +80,7 @@ Audio and Video transmission have a common characteristic: Having a stable, high - Distributed measurement: Controllers -Lets say we have a factory with a network of distributed temperature sensors and we want to use eProsima Fast RTPS to send data from said sensors to an automation computer which +Lets say we have a factory with a network of distributed temperature sensors and we want to use eProsima Fast DDS to send data from said sensors to an automation computer which makes decisions based on the temperature distribution. We would group all sensors within one single topic, Reliability: Reliable. We want to make sure samples are not lost. Furthermore, since reliable more ensures data delivery, it allows us to detect hardware problems when a sensor becomes silent diff --git a/examples/cpp/dds/SecureHelloWorldExample/CMakeLists.txt b/examples/cpp/dds/SecureHelloWorldExample/CMakeLists.txt index a06592719d7..237263af779 100644 --- a/examples/cpp/dds/SecureHelloWorldExample/CMakeLists.txt +++ b/examples/cpp/dds/SecureHelloWorldExample/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -48,7 +48,7 @@ target_compile_definitions(DDSSecureHelloWorldExample PRIVATE $<$:__INTERNALDEBUG> # Internal debug activated. ) target_include_directories(DDSSecureHelloWorldExample PRIVATE) -target_link_libraries(DDSSecureHelloWorldExample fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSSecureHelloWorldExample fastdds fastcdr foonathan_memory) install(TARGETS DDSSecureHelloWorldExample RUNTIME DESTINATION examples/cpp/dds/SecureHelloWorldExample/${BIN_INSTALL_DIR}) install(DIRECTORY ${PROJECT_SOURCE_DIR}/certs diff --git a/examples/cpp/dds/SecureHelloWorldExample/HelloWorld_main.cpp b/examples/cpp/dds/SecureHelloWorldExample/HelloWorld_main.cpp index 9294faf0f43..215766a17e2 100644 --- a/examples/cpp/dds/SecureHelloWorldExample/HelloWorld_main.cpp +++ b/examples/cpp/dds/SecureHelloWorldExample/HelloWorld_main.cpp @@ -17,15 +17,16 @@ * */ +#include + #include "HelloWorldPublisher.h" #include "HelloWorldSubscriber.h" -#include -#include - using namespace eprosima; using namespace fastrtps; using namespace rtps; +using namespace eprosima::fastdds::dds; + int main( int argc, char** argv) @@ -71,7 +72,6 @@ int main( break; } } - Domain::stopAll(); Log::Reset(); return 0; } diff --git a/examples/cpp/dds/StaticHelloWorldExample/CMakeLists.txt b/examples/cpp/dds/StaticHelloWorldExample/CMakeLists.txt index cbe65f36bc6..f9c95e72240 100644 --- a/examples/cpp/dds/StaticHelloWorldExample/CMakeLists.txt +++ b/examples/cpp/dds/StaticHelloWorldExample/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -52,7 +52,7 @@ target_compile_definitions(DDSStaticHelloWorldExample PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSStaticHelloWorldExample fastrtps fastcdr foonathan_memory) +target_link_libraries(DDSStaticHelloWorldExample fastdds fastcdr foonathan_memory) install(TARGETS DDSStaticHelloWorldExample RUNTIME DESTINATION examples/cpp/dds/StaticHelloWorldExample/${BIN_INSTALL_DIR}) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/HelloWorldPublisher_static_disc.xml diff --git a/examples/cpp/dds/StaticHelloWorldExample/HelloWorld_main.cpp b/examples/cpp/dds/StaticHelloWorldExample/HelloWorld_main.cpp index d6806155bda..954b0f91ae8 100644 --- a/examples/cpp/dds/StaticHelloWorldExample/HelloWorld_main.cpp +++ b/examples/cpp/dds/StaticHelloWorldExample/HelloWorld_main.cpp @@ -17,15 +17,16 @@ * */ +#include + #include "HelloWorldPublisher.h" #include "HelloWorldSubscriber.h" -#include -#include - using namespace eprosima; using namespace fastrtps; using namespace rtps; +using namespace eprosima::fastdds::dds; + int main( int argc, char** argv) @@ -72,7 +73,6 @@ int main( break; } } - Domain::stopAll(); Log::Reset(); return 0; } diff --git a/examples/cpp/dds/TypeLookupService/CMakeLists.txt b/examples/cpp/dds/TypeLookupService/CMakeLists.txt index b53eb6cdae0..bcbe9c9c84b 100644 --- a/examples/cpp/dds/TypeLookupService/CMakeLists.txt +++ b/examples/cpp/dds/TypeLookupService/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -44,7 +44,7 @@ target_compile_definitions(TypeLookupExample PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(TypeLookupExample fastrtps fastcdr) +target_link_libraries(TypeLookupExample fastdds fastcdr) install(TARGETS TypeLookupExample RUNTIME DESTINATION examples/cpp/dds/TypeLookupService/${BIN_INSTALL_DIR}) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/example_type_profile.xml diff --git a/examples/cpp/dds/TypeLookupService/TypeLookupPublisher.cpp b/examples/cpp/dds/TypeLookupService/TypeLookupPublisher.cpp index 47e1e554712..c7d565d96f5 100644 --- a/examples/cpp/dds/TypeLookupService/TypeLookupPublisher.cpp +++ b/examples/cpp/dds/TypeLookupService/TypeLookupPublisher.cpp @@ -18,20 +18,17 @@ */ #include "TypeLookupPublisher.h" -#include -#include -#include -#include + +#include + +#include #include +#include #include -#include - +#include #include - #include -#include - using namespace eprosima::fastdds::dds; using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; diff --git a/examples/cpp/dds/TypeLookupService/TypeLookupSubscriber.cpp b/examples/cpp/dds/TypeLookupService/TypeLookupSubscriber.cpp index 108822411d0..999d8938286 100644 --- a/examples/cpp/dds/TypeLookupService/TypeLookupSubscriber.cpp +++ b/examples/cpp/dds/TypeLookupService/TypeLookupSubscriber.cpp @@ -26,8 +26,6 @@ #include #include #include -#include -#include #include #include #include @@ -173,11 +171,6 @@ void TypeLookupSubscriber::SubListener::on_type_information_received( if (subscriber_->mp_subscriber == nullptr) { - //SubscriberAttributes Rparam; - //Rparam = subscriber_->att_; - //Rparam.topic = subscriber_->topic_; - //Rparam.topic.topicName = topic_name; - //Rparam.qos = subscriber_->qos_; subscriber_->mp_subscriber = subscriber_->mp_participant->create_subscriber( SUBSCRIBER_QOS_DEFAULT, nullptr); diff --git a/examples/cpp/dds/TypeLookupService/TypeLookupSubscriber.h b/examples/cpp/dds/TypeLookupService/TypeLookupSubscriber.h index 07654ce8019..3d28f8d81d9 100644 --- a/examples/cpp/dds/TypeLookupService/TypeLookupSubscriber.h +++ b/examples/cpp/dds/TypeLookupService/TypeLookupSubscriber.h @@ -20,20 +20,17 @@ #ifndef HELLOWORLDSUBSCRIBER_H_ #define HELLOWORLDSUBSCRIBER_H_ +#include + #include #include #include #include -#include -#include - +#include +#include #include #include -#include - -#include - class TypeLookupSubscriber { public: @@ -64,8 +61,6 @@ class TypeLookupSubscriber std::map datas_; - eprosima::fastrtps::SubscriberAttributes att_; - eprosima::fastdds::dds::DataReaderQos qos_; public: diff --git a/examples/cpp/dds/TypeLookupService/TypeLookup_main.cpp b/examples/cpp/dds/TypeLookupService/TypeLookup_main.cpp index cf11cf2a71c..fe8b961f045 100644 --- a/examples/cpp/dds/TypeLookupService/TypeLookup_main.cpp +++ b/examples/cpp/dds/TypeLookupService/TypeLookup_main.cpp @@ -17,12 +17,13 @@ * */ +#include + #include "TypeLookupPublisher.h" #include "TypeLookupSubscriber.h" -#include - using namespace eprosima::fastrtps; +using namespace eprosima::fastdds::dds; int main( int argc, diff --git a/examples/cpp/dds/TypeLookupService/example_type_profile.xml b/examples/cpp/dds/TypeLookupService/example_type_profile.xml index d11369f1e39..331b0c63290 100644 --- a/examples/cpp/dds/TypeLookupService/example_type_profile.xml +++ b/examples/cpp/dds/TypeLookupService/example_type_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/examples/cpp/dds/WriterLoansExample/CMakeLists.txt b/examples/cpp/dds/WriterLoansExample/CMakeLists.txt index 4aceabc3907..7acc8fa94ac 100644 --- a/examples/cpp/dds/WriterLoansExample/CMakeLists.txt +++ b/examples/cpp/dds/WriterLoansExample/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -43,6 +43,6 @@ target_compile_definitions(DDSWriterLoansExample PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSWriterLoansExample fastrtps fastcdr) +target_link_libraries(DDSWriterLoansExample fastdds fastcdr) install(TARGETS DDSWriterLoansExample RUNTIME DESTINATION examples/cpp/dds/WriterLoansExample/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/dds/ZeroCopyExample/CMakeLists.txt b/examples/cpp/dds/ZeroCopyExample/CMakeLists.txt index 817e2028164..468ffbade99 100644 --- a/examples/cpp/dds/ZeroCopyExample/CMakeLists.txt +++ b/examples/cpp/dds/ZeroCopyExample/CMakeLists.txt @@ -21,8 +21,8 @@ if(NOT fastcdr_FOUND) find_package(fastcdr 2 REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -43,6 +43,6 @@ target_compile_definitions(DDSZeroCopyExample PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSZeroCopyExample fastrtps fastcdr) +target_link_libraries(DDSZeroCopyExample fastdds fastcdr) install(TARGETS DDSZeroCopyExample RUNTIME DESTINATION examples/cpp/dds/ZeroCopyExample/${BIN_INSTALL_DIR}) diff --git a/examples/cpp/rtps/AsSocket/CMakeLists.txt b/examples/cpp/rtps/AsSocket/CMakeLists.txt index 27e868d53f0..5fcdcb79a42 100644 --- a/examples/cpp/rtps/AsSocket/CMakeLists.txt +++ b/examples/cpp/rtps/AsSocket/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(AsSocket PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(AsSocket fastrtps fastcdr foonathan_memory) +target_link_libraries(AsSocket fastdds fastcdr foonathan_memory) install(TARGETS AsSocket RUNTIME DESTINATION examples/cpp/rtps/AsSocket/${BIN_INSTALL_DIR} ) diff --git a/examples/cpp/rtps/AsSocket/TestReaderSocket.cpp b/examples/cpp/rtps/AsSocket/TestReaderSocket.cpp index d2741a7e9be..eba85f36f85 100644 --- a/examples/cpp/rtps/AsSocket/TestReaderSocket.cpp +++ b/examples/cpp/rtps/AsSocket/TestReaderSocket.cpp @@ -19,16 +19,14 @@ #include "TestReaderSocket.h" -#include "fastrtps/rtps/reader/RTPSReader.h" -#include "fastrtps/rtps/participant/RTPSParticipant.h" -#include "fastrtps/rtps/RTPSDomain.h" - -#include "fastrtps/rtps/attributes/RTPSParticipantAttributes.h" -#include "fastrtps/rtps/attributes/ReaderAttributes.h" -#include "fastrtps/rtps/attributes/HistoryAttributes.h" - -#include "fastrtps/rtps/history/ReaderHistory.h" -#include "fastrtps/utils/IPLocator.h" +#include +#include +#include +#include +#include +#include +#include +#include using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; diff --git a/examples/cpp/rtps/AsSocket/TestReaderSocket.h b/examples/cpp/rtps/AsSocket/TestReaderSocket.h index c7f815b48d5..6f562eb6c0f 100644 --- a/examples/cpp/rtps/AsSocket/TestReaderSocket.h +++ b/examples/cpp/rtps/AsSocket/TestReaderSocket.h @@ -20,10 +20,8 @@ #ifndef TESTREADERSOCKET_H_ #define TESTREADERSOCKET_H_ -#include "fastrtps/rtps/rtps_fwd.h" - - -#include "fastrtps/rtps/reader/ReaderListener.h" +#include +#include class TestReaderSocket { diff --git a/examples/cpp/rtps/AsSocket/TestWriterSocket.cpp b/examples/cpp/rtps/AsSocket/TestWriterSocket.cpp index 9579c7baecb..ef6522bb6d1 100644 --- a/examples/cpp/rtps/AsSocket/TestWriterSocket.cpp +++ b/examples/cpp/rtps/AsSocket/TestWriterSocket.cpp @@ -19,18 +19,15 @@ #include "TestWriterSocket.h" -#include "fastrtps/rtps/writer/RTPSWriter.h" -#include "fastrtps/rtps/participant/RTPSParticipant.h" -#include "fastrtps/rtps/RTPSDomain.h" - -#include "fastrtps/rtps/attributes/RTPSParticipantAttributes.h" -#include "fastrtps/rtps/attributes/WriterAttributes.h" -#include "fastrtps/rtps/attributes/HistoryAttributes.h" - -#include "fastrtps/rtps/builtin/data/ReaderProxyData.h" - -#include "fastrtps/rtps/history/WriterHistory.h" -#include "fastrtps/utils/IPLocator.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; diff --git a/examples/cpp/rtps/AsSocket/TestWriterSocket.h b/examples/cpp/rtps/AsSocket/TestWriterSocket.h index 08202aacfe6..e3b1da2eaa5 100644 --- a/examples/cpp/rtps/AsSocket/TestWriterSocket.h +++ b/examples/cpp/rtps/AsSocket/TestWriterSocket.h @@ -20,12 +20,11 @@ #ifndef TESTWRITERSOCKET_H_ #define TESTWRITERSOCKET_H_ -#include "fastrtps/rtps/rtps_fwd.h" - - -#include -#include #include +#include +#include + +#include class TestWriterSocket { diff --git a/examples/cpp/rtps/AsSocket/main_RTPSTest.cpp b/examples/cpp/rtps/AsSocket/main_RTPSTest.cpp index 12a4046a076..1b15de7c479 100644 --- a/examples/cpp/rtps/AsSocket/main_RTPSTest.cpp +++ b/examples/cpp/rtps/AsSocket/main_RTPSTest.cpp @@ -12,16 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include -#include -#include #include #include +#include +#include +#include #include +#include -#include "fastrtps/log/Log.h" -#include "fastrtps/rtps/RTPSDomain.h" +#include #include "TestWriterSocket.h" #include "TestReaderSocket.h" @@ -31,7 +30,6 @@ using namespace fastrtps; using namespace rtps; using namespace std; - int main( int argc, char** argv) diff --git a/examples/cpp/rtps/Persistent/CMakeLists.txt b/examples/cpp/rtps/Persistent/CMakeLists.txt index 0463dd49a79..4766274f096 100644 --- a/examples/cpp/rtps/Persistent/CMakeLists.txt +++ b/examples/cpp/rtps/Persistent/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(Persistent PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(Persistent fastrtps fastcdr foonathan_memory) +target_link_libraries(Persistent fastdds fastcdr foonathan_memory) install(TARGETS Persistent RUNTIME DESTINATION examples/cpp/rtps/Persistent/${BIN_INSTALL_DIR} ) diff --git a/examples/cpp/rtps/Persistent/TestReaderPersistent.cpp b/examples/cpp/rtps/Persistent/TestReaderPersistent.cpp index d5335281463..8320dda1250 100644 --- a/examples/cpp/rtps/Persistent/TestReaderPersistent.cpp +++ b/examples/cpp/rtps/Persistent/TestReaderPersistent.cpp @@ -19,18 +19,15 @@ #include "TestReaderPersistent.h" -#include -#include -#include - -#include -#include -#include - -#include - +#include +#include +#include +#include +#include +#include +#include +#include #include -#include using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; @@ -94,7 +91,7 @@ bool TestReaderPersistent::reg() Tatt.topicKind = NO_KEY; Tatt.topicDataType = "string"; Tatt.topicName = "exampleTopic"; - ReaderQos Rqos; + eprosima::fastdds::dds::ReaderQos Rqos; return mp_participant->registerReader(mp_reader, Tatt, Rqos); } diff --git a/examples/cpp/rtps/Persistent/TestReaderPersistent.h b/examples/cpp/rtps/Persistent/TestReaderPersistent.h index b55f4aa9cdc..ce635e11f33 100644 --- a/examples/cpp/rtps/Persistent/TestReaderPersistent.h +++ b/examples/cpp/rtps/Persistent/TestReaderPersistent.h @@ -20,10 +20,8 @@ #ifndef TESTREADERPERSISTENT_H_ #define TESTREADERPERSISTENT_H_ -#include - - -#include +#include +#include class TestReaderPersistent { diff --git a/examples/cpp/rtps/Persistent/TestWriterPersistent.cpp b/examples/cpp/rtps/Persistent/TestWriterPersistent.cpp index 02be80fb581..2bf2d844613 100644 --- a/examples/cpp/rtps/Persistent/TestWriterPersistent.cpp +++ b/examples/cpp/rtps/Persistent/TestWriterPersistent.cpp @@ -22,15 +22,15 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; @@ -97,7 +97,7 @@ bool TestWriterPersistent::reg() Tatt.topicKind = NO_KEY; Tatt.topicDataType = "string"; Tatt.topicName = "exampleTopic"; - WriterQos Wqos; + eprosima::fastdds::dds::WriterQos Wqos; return mp_participant->registerWriter(mp_writer, Tatt, Wqos); } diff --git a/examples/cpp/rtps/Persistent/TestWriterPersistent.h b/examples/cpp/rtps/Persistent/TestWriterPersistent.h index 6ea3716369f..24eba95a982 100644 --- a/examples/cpp/rtps/Persistent/TestWriterPersistent.h +++ b/examples/cpp/rtps/Persistent/TestWriterPersistent.h @@ -20,10 +20,8 @@ #ifndef TESTWRITERPERSISTENT_H_ #define TESTWRITERPERSISTENT_H_ -#include - - -#include +#include +#include class TestWriterPersistent { diff --git a/examples/cpp/rtps/Persistent/main_RTPSTest.cpp b/examples/cpp/rtps/Persistent/main_RTPSTest.cpp index c3361bbb7f2..171675f3bef 100644 --- a/examples/cpp/rtps/Persistent/main_RTPSTest.cpp +++ b/examples/cpp/rtps/Persistent/main_RTPSTest.cpp @@ -12,26 +12,24 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include -#include -#include #include #include +#include +#include +#include #include +#include -#include -#include +#include -#include "TestWriterPersistent.h" #include "TestReaderPersistent.h" +#include "TestWriterPersistent.h" using namespace eprosima; using namespace fastrtps; using namespace rtps; using namespace std; - int main( int argc, char** argv) diff --git a/examples/cpp/rtps/Registered/CMakeLists.txt b/examples/cpp/rtps/Registered/CMakeLists.txt index 3cd10781e41..d28ff14cadd 100644 --- a/examples/cpp/rtps/Registered/CMakeLists.txt +++ b/examples/cpp/rtps/Registered/CMakeLists.txt @@ -25,8 +25,8 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() #Check C++11 @@ -46,7 +46,7 @@ target_compile_definitions(Registered PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(Registered fastrtps fastcdr foonathan_memory) +target_link_libraries(Registered fastdds fastcdr foonathan_memory) install(TARGETS Registered RUNTIME DESTINATION examples/cpp/rtps/Registered/${BIN_INSTALL_DIR} ) diff --git a/examples/cpp/rtps/Registered/TestReaderRegistered.cpp b/examples/cpp/rtps/Registered/TestReaderRegistered.cpp index b0feb7c7755..6a3da647a25 100644 --- a/examples/cpp/rtps/Registered/TestReaderRegistered.cpp +++ b/examples/cpp/rtps/Registered/TestReaderRegistered.cpp @@ -19,18 +19,15 @@ #include "TestReaderRegistered.h" -#include "fastrtps/rtps/reader/RTPSReader.h" -#include "fastrtps/rtps/participant/RTPSParticipant.h" -#include "fastrtps/rtps/RTPSDomain.h" - -#include "fastrtps/rtps/attributes/RTPSParticipantAttributes.h" -#include "fastrtps/rtps/attributes/ReaderAttributes.h" -#include "fastrtps/rtps/attributes/HistoryAttributes.h" - -#include "fastrtps/rtps/history/ReaderHistory.h" - -#include "fastrtps/attributes/TopicAttributes.h" -#include "fastrtps/qos/ReaderQos.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; @@ -86,7 +83,7 @@ bool TestReaderRegistered::reg() Tatt.topicKind = NO_KEY; Tatt.topicDataType = "string"; Tatt.topicName = "exampleTopic"; - ReaderQos Rqos; + eprosima::fastdds::dds::ReaderQos Rqos; return mp_participant->registerReader(mp_reader, Tatt, Rqos); } diff --git a/examples/cpp/rtps/Registered/TestReaderRegistered.h b/examples/cpp/rtps/Registered/TestReaderRegistered.h index 3c1799b7654..860133aefd9 100644 --- a/examples/cpp/rtps/Registered/TestReaderRegistered.h +++ b/examples/cpp/rtps/Registered/TestReaderRegistered.h @@ -20,10 +20,8 @@ #ifndef TESTREADERREGISTERED_H_ #define TESTREADERREGISTERED_H_ -#include "fastrtps/rtps/rtps_fwd.h" - - -#include "fastrtps/rtps/reader/ReaderListener.h" +#include +#include class TestReaderRegistered { diff --git a/examples/cpp/rtps/Registered/TestWriterRegistered.cpp b/examples/cpp/rtps/Registered/TestWriterRegistered.cpp index 04155160eb0..111c8aaa69c 100644 --- a/examples/cpp/rtps/Registered/TestWriterRegistered.cpp +++ b/examples/cpp/rtps/Registered/TestWriterRegistered.cpp @@ -22,15 +22,15 @@ #include #include -#include "fastrtps/attributes/TopicAttributes.h" -#include "fastrtps/qos/WriterQos.h" -#include "fastrtps/rtps/attributes/HistoryAttributes.h" -#include "fastrtps/rtps/attributes/RTPSParticipantAttributes.h" -#include "fastrtps/rtps/attributes/WriterAttributes.h" -#include "fastrtps/rtps/history/WriterHistory.h" -#include "fastrtps/rtps/participant/RTPSParticipant.h" -#include "fastrtps/rtps/RTPSDomain.h" -#include "fastrtps/rtps/writer/RTPSWriter.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; @@ -88,7 +88,7 @@ bool TestWriterRegistered::reg() Tatt.topicKind = NO_KEY; Tatt.topicDataType = "string"; Tatt.topicName = "exampleTopic"; - WriterQos Wqos; + eprosima::fastdds::dds::WriterQos Wqos; return mp_participant->registerWriter(mp_writer, Tatt, Wqos); } diff --git a/examples/cpp/rtps/Registered/TestWriterRegistered.h b/examples/cpp/rtps/Registered/TestWriterRegistered.h index 110d176e4a4..3e7776d080e 100644 --- a/examples/cpp/rtps/Registered/TestWriterRegistered.h +++ b/examples/cpp/rtps/Registered/TestWriterRegistered.h @@ -20,10 +20,8 @@ #ifndef TESTWRITERREGISTERED_H_ #define TESTWRITERREGISTERED_H_ -#include "fastrtps/rtps/rtps_fwd.h" - - -#include "fastrtps/rtps/writer/WriterListener.h" +#include +#include class TestWriterRegistered { diff --git a/examples/cpp/rtps/Registered/main_RTPSTest.cpp b/examples/cpp/rtps/Registered/main_RTPSTest.cpp index d66129c0ee9..cf444a2a450 100644 --- a/examples/cpp/rtps/Registered/main_RTPSTest.cpp +++ b/examples/cpp/rtps/Registered/main_RTPSTest.cpp @@ -12,26 +12,24 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include -#include -#include #include #include +#include +#include +#include #include +#include -#include "fastrtps/log/Log.h" -#include "fastrtps/rtps/RTPSDomain.h" +#include -#include "TestWriterRegistered.h" #include "TestReaderRegistered.h" +#include "TestWriterRegistered.h" using namespace eprosima; using namespace fastrtps; using namespace rtps; using namespace std; - int main( int argc, char** argv) diff --git a/fastrtps.repos b/fastdds.repos similarity index 97% rename from fastrtps.repos rename to fastdds.repos index 69dec7e99cd..d7f5829ec2c 100644 --- a/fastrtps.repos +++ b/fastdds.repos @@ -7,7 +7,7 @@ repositories: type: git url: https://github.com/eProsima/Fast-CDR.git version: master - fastrtps: + fastdds: type: git url: https://github.com/eProsima/Fast-DDS.git version: master diff --git a/fuzz/C++/fuzz_XMLProfiles/CMakeLists.txt b/fuzz/C++/fuzz_XMLProfiles/CMakeLists.txt index f40256d20a4..e06af4c0bdf 100644 --- a/fuzz/C++/fuzz_XMLProfiles/CMakeLists.txt +++ b/fuzz/C++/fuzz_XMLProfiles/CMakeLists.txt @@ -25,12 +25,12 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() message(STATUS "Configuring fuzz_XMLProfiles...") file(GLOB SOURCES_CXX "*.cxx") add_executable(fuzz_XMLProfiles ${SOURCES_CXX} ${SOURCES_CPP}) -target_link_libraries(fuzz_XMLProfiles fastrtps fastcdr foonathan_memory $ENV{LIB_FUZZING_ENGINE}) +target_link_libraries(fuzz_XMLProfiles fastdds fastcdr foonathan_memory $ENV{LIB_FUZZING_ENGINE}) diff --git a/fuzz/C++/fuzz_XMLProfiles/fuzz_XMLProfiles_seed_corpus/1c82a2c60044985396a5dbbe58ad7fcc5d852d38 b/fuzz/C++/fuzz_XMLProfiles/fuzz_XMLProfiles_seed_corpus/1c82a2c60044985396a5dbbe58ad7fcc5d852d38 index 3ed7cce679a..e807c4c68d8 100644 --- a/fuzz/C++/fuzz_XMLProfiles/fuzz_XMLProfiles_seed_corpus/1c82a2c60044985396a5dbbe58ad7fcc5d852d38 +++ b/fuzz/C++/fuzz_XMLProfiles/fuzz_XMLProfiles_seed_corpus/1c82a2c60044985396a5dbbe58ad7fcc5d852d38 @@ -1,5 +1,5 @@ - + 80 diff --git a/fuzz/C++/fuzz_processCDRMsg/CMakeLists.txt b/fuzz/C++/fuzz_processCDRMsg/CMakeLists.txt index 0cf01c3bbd4..b5834bf749e 100644 --- a/fuzz/C++/fuzz_processCDRMsg/CMakeLists.txt +++ b/fuzz/C++/fuzz_processCDRMsg/CMakeLists.txt @@ -11,12 +11,12 @@ if(NOT foonathan_memory_FOUND) find_package(foonathan_memory REQUIRED) endif() -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() message(STATUS "Configuring fuzz_processCDRMsg...") file(GLOB SOURCES_CXX "fuzz_*.cxx") add_executable(fuzz_processCDRMsg ${SOURCES_CXX}) -target_link_libraries(fuzz_processCDRMsg fastrtps fastcdr foonathan_memory $ENV{LIB_FUZZING_ENGINE}) +target_link_libraries(fuzz_processCDRMsg fastdds fastcdr foonathan_memory $ENV{LIB_FUZZING_ENGINE}) diff --git a/fuzz/C++/fuzz_processCDRMsg/fuzz_processCDRMsg.cxx b/fuzz/C++/fuzz_processCDRMsg/fuzz_processCDRMsg.cxx index 88c26a5b475..ad5eb5e139d 100644 --- a/fuzz/C++/fuzz_processCDRMsg/fuzz_processCDRMsg.cxx +++ b/fuzz/C++/fuzz_processCDRMsg/fuzz_processCDRMsg.cxx @@ -4,8 +4,8 @@ #include #include -#include #include +#include #define MIN_SIZE RTPSMESSAGE_HEADER_SIZE #define MAX_SIZE 64000 diff --git a/fuzz/CMakeLists.txt b/fuzz/CMakeLists.txt index d946f714f47..29c48a68c5b 100644 --- a/fuzz/CMakeLists.txt +++ b/fuzz/CMakeLists.txt @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(fastrtps_FOUND TRUE) +set(fastdds_FOUND TRUE) add_subdirectory(C++/fuzz_XMLProfiles) add_subdirectory(C++/fuzz_processCDRMsg) \ No newline at end of file diff --git a/include/dds/core/BuiltinTopicTypes.hpp b/include/dds/core/BuiltinTopicTypes.hpp deleted file mode 100644 index 46bdcb9ef45..00000000000 --- a/include/dds/core/BuiltinTopicTypes.hpp +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_BUILTIN_TOPIC_TYPES_HPP_ -#define OMG_DDS_CORE_BUILTIN_TOPIC_TYPES_HPP_ - -#include -#include - -#if defined (OMG_DDS_X_TYPES_BUILTIN_TOPIC_TYPES_SUPPORT) -namespace dds { -namespace core { - -/** - * @brief - * Class that is a built-in topic type that can be used to readily create Topics, - * DataReaders and DataWriters for this type without the need for code generation. - * - * This built-in type allows for easy transfer of vectors of bytes. - */ -template -class TBytesTopicType : public Value -{ -public: - - /** - * Creates topic type with an empty byte vector. - */ - TBytesTopicType(); - - /** - * Creates topic type with the given byte vector. - */ - TBytesTopicType( - const std::vector& data); - - /** - * Conversion operator to a vector of bytes. - */ - operator std::vector&() const; - - /** - * Getter function for the internal vector of bytes. - */ - const std::vector& data() const; - - /** - * Setter function for the internal vector of bytes. - */ - void data( - const std::vector& data); -}; - - -/** - * @brief - * Class that is a built-in topic type that can be used to readily create Topics, - * DataReaders and DataWriters for this type without the need for code generation. - * - * This built-in type allows for easy transfer of strings. - */ -template -class TStringTopicType : public Value -{ -public: - - /** - * Creates topic type with an empty data string. - */ - TStringTopicType(); - - /** - * Creates topic type with the given string. - */ - TStringTopicType( - const std::string& data); - - /** - * Conversion operator to a string. - */ - operator std::string& () const; - - /** - * Getter function for the internal data string. - */ - const std::string& data() const; - - /** - * Setter function for the internal data string. - */ - void data( - const std::string& data); -}; - -/** - * @brief - * Class that is a built-in topic type that can be used to readily create Topics, - * DataReaders and DataWriters for this type without the need for code generation. - * - * This built-in type allows for easy transfer of keyed strings. - */ -template -class TKeyedStringTopicType : public Value -{ -public: - - /** - * Creates topic type with an empty key and data strings. - */ - TKeyedStringTopicType(); - - /** - * Creates topic type with the given key and data strings. - */ - TKeyedStringTopicType( - const std::string& key, - const std::string& value); - - /** - * Getter function for the key string. - */ - const std::string& key() const; - - /** - * Setter function for the key string. - */ - void key( - const std::string& key); - - /** - * Getter function for the internal data string. - */ - const std::string& value() const; - - /** - * Setter function for the internal data string. - */ - void value( - const std::string& value); -}; - -/** - * @brief - * Class that is a built-in topic type that can be used to readily create Topics, - * DataReaders and DataWriters for this type without the need for code generation. - * - * This built-in type allows for easy transfer of keyed vectors of bytes. - */ -template -class TKeyedBytesTopicType : public Value -{ -public: - - /** - * Creates topic type with an empty key string and data vector. - */ - TKeyedBytesTopicType(); - - /** - * Creates topic type with given key string and data vector. - */ - TKeyedBytesTopicType( - const std::string& key, - const std::vector& value); - - /** - * Getter function for the key string. - */ - const std::string& key() const; - - /** - * Setter function for the key string. - */ - void key( - const std::string& key); - - /** - * Getter function for the internal vector of bytes. - */ - const std::vector& value() const; - - /** - * Setter function for the internal vector of bytes. - */ - void value( - const std::vector& value); -}; - -/** - * @file - * This file contains the type definitions for BuiltinTopicTypes - */ -typedef dds::core::detail::BytesTopicType BytesTopicType; -typedef dds::core::detail::StringTopicType StringTopicType; -typedef dds::core::detail::KeyedBytesTopicType KeyedBytesTopicType; -typedef dds::core::detail::KeyedStringTopicType KeyedStringTopicType; - -} //namespace core -} //namespace dds - -#endif //OMG_DDS_X_TYPES_BUILTIN_TOPIC_TYPES_SUPPORT - -#endif //OMG_DDS_CORE_BUILTIN_TOPIC_TYPES_HPP_ diff --git a/include/dds/core/Duration.hpp b/include/dds/core/Duration.hpp deleted file mode 100644 index ae7cbff1e73..00000000000 --- a/include/dds/core/Duration.hpp +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_DURATION_HPP_ -#define OMG_DDS_CORE_DURATION_HPP_ - -#include - -namespace dds { -namespace core { - -/** - * @file - * This class represents a time interval. - */ - -/** - * Duration represents a time interval and - - * * Can be incremented by durations expressed as seconds, nanoseconds - * milliseconds, or Duration objects. - * - * * Can be converted to and from Durations expressed in - * milliseconds (or other units) as integer types. - */ -class OMG_DDS_API Duration -{ -public: - - /** - * Create a Duration elapsing zero seconds. - */ - static const Duration zero(); // {0, 0} - - /** - * Create an infinite Duration. - */ - static const Duration infinite(); // {0x7fffffff, 0x7fffffff} - - /** - * Create a Duration elapsing the default amount of time (zero seconds). - */ - Duration(); - - /** - * Create a Duration elapsing a specific amount of time. - * - * @param sec Amount of seconds for the Duration. - * @param nanosec Amount of nanoseconds for the Duration. - */ - explicit Duration( - int32_t sec, - uint32_t nanosec = 0); - -#if __cplusplus >= 199711L - /** @copydoc dds::core::Duration::Duration(int32_t sec, uint32_t nanosec = 0) */ - explicit Duration( - int64_t sec, - uint32_t nanosec = 0); -#endif - - /** - * Create a Duration from a number of microseconds - * @param microseconds number of microseconds - */ - static const Duration from_microsecs( - int64_t microseconds); - - /** - * Create a Duration from a number of milliseconds - * @param miliseconds number of milliseconds - */ - static const Duration from_millisecs( - int64_t milliseconds); - - /** - * Create a Duration from a number of seconds - * @param seconds number of seconds - */ - static const Duration from_secs( - double seconds); - - /** - * Get seconds part of the Duration. - * @return number of seconds - */ - int64_t sec() const; - /** - * Set number of seconds - * @param s number of seconds - */ - void sec( - int64_t s); - - /** - * Get nanoseconds part of the Duration. - * @return number of nanoseconds - */ - uint32_t nanosec() const; - /** - * Set number of nanoseconds - * @param ns number of nanoseconds - */ - void nanosec( - uint32_t ns); - - /** - * Returns an integer value for a comparison of two Durations: - * 1 if this Duration is greater than the comparator (that) - * -1 if the Duration is less than the comparator (that) - * 0 if the Duration matches the comparator (that) - * - * @param that Duration to compare - * - * @return comparison result - */ - int compare( - const Duration& that) const; - - /** - * Returns true if the Duration is greater than the comparator - * - * @param that Duration to compare - * @return comparison result - */ - bool operator >( - const Duration& that) const; - - /** - * Returns true if the Duration is greater than or equal to the comparator - * @param Duration &that - */ - bool operator >=( - const Duration& that) const; - - /** - * Returns true if the Duration is not equal to the comparator - * - * @param that Duration to compare - * @return comparison result - */ - bool operator !=( - const Duration& that) const; - - /** - * Returns true if the Duration is equal to the comparator - * - * @param that Duration to compare - * @return comparison result - */ - bool operator ==( - const Duration& that) const; - - /** - * Returns true if the Duration is less than or equal to the comparator - * - * @param that Duration to compare - * @return comparison result - */ - bool operator <=( - const Duration& that) const; - - /** - * Returns true if the Duration is less than the comparator - * - * @param that Duration to compare - * @return comparison result - */ - bool operator <( - const Duration& that) const; - - /** - * Add a Duration to this Duration - * - * @param a_ti Duration to add - * @return this Duration + a_ti - */ - Duration& operator +=( - const Duration& a_ti); - - /** - * Subtract a Duration from this Duration - * - * @param a_ti Duration to subtract - * @return this Duration - a_ti - */ - Duration& operator -=( - const Duration& a_ti); - - /** - * Multiply this Duration by a factor - * - * @param factor the factor to multiply this Duration by - * @return this Duration * factor - */ - Duration& operator *=( - uint64_t factor); - - /** - * Add a Duration to Duration - * - * @param other a Duration - * @return Duration + other - */ - const Duration operator +( - const Duration& other) const; - - /** - * Subtract a Duration from Duration - * - * @param other a Duration - * @return the Duration - other - */ - const Duration operator -( - const Duration& other) const; - /** - * Returns this Duration in milliseconds. - * - * @return the duration in milliseconds - */ - int64_t to_millisecs() const; - - /** - * Returns this Duration in micro-seconds. - * - * @return the duration in micro-seconds - */ - int64_t to_microsecs() const; - - /** - * Returns this Duration in seconds. - * - * @return the duration in seconds - */ - double to_secs() const; - -private: - - int32_t sec_ = 0; - uint32_t nsec_ = 0; -}; - -/** - * Multiply Duration by a factor - * - * @param lhs factor by which to multiply - * @param rhs Duration to multiply - * - * @return factor * Duration - */ -const Duration OMG_DDS_API operator *( - uint64_t lhs, - const Duration& rhs); - -/** - * Multiply Duration by a factor - * - * @param lhs Duration to multiply - * @param rhs factor by which to multiply - * - * @return Duration * factor - */ -const Duration OMG_DDS_API operator *( - const Duration& lhs, - uint64_t rhs); - -/** - * Divide Duration by a factor - * - * @param lhs Duration to divide - * @param rhs factor by which to divide - */ -const Duration OMG_DDS_API operator /( - const Duration& lhs, - uint64_t rhs); - -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_DURATION_HPP_ diff --git a/include/dds/core/Entity.hpp b/include/dds/core/Entity.hpp deleted file mode 100644 index db5c970b61d..00000000000 --- a/include/dds/core/Entity.hpp +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_ENTITY_HPP_ -#define OMG_DDS_CORE_ENTITY_HPP_ - -#include -#include -#include - -#include - -namespace dds { -namespace core { - -/** - * @brief This class is the abstract base class for all the DCPS objects. - * - * This class is the abstract base class for all of the DCPS objects - * that support QoS policies a listener and a status condition: - * - * - dds::domain::DomainParticipant - * - dds::sub::Subscriber - * - dds::sub::DataReader - * - dds::pub::Publisher - * - dds::pub::DataWriter - * - dds::topic::Topic - * - * In the ISO C++ PSM each DDS entity behaves like a polymorphic reference - * in that it automatically manages its resource and it can be - * safely assigned up and down the DDS Entity type hierarchy. - * - */ -template -class TEntity : public virtual Reference -{ -public: - - OMG_DDS_REF_TYPE_PROTECTED_DC( - TEntity, - Reference, - DELEGATE) - - OMG_DDS_IMPLICIT_REF_BASE( - TEntity) - - /** @cond */ - virtual ~TEntity() - { - } - - /** @endcond */ - - /** - * Enable entity. - * - * This operation enables the Entity. Entity objects can be created - * either enabled or disabled. This is controlled by the value of - * the dds::core::policy::EntityFactory QoS policy on the corresponding - * factory for the Entity. - * - * Enabled entities are immediately activated at creation time meaning all their - * immutable QoS settings can no longer be changed. Disabled Entities are not yet - * activated, so it is still possible to change there immutable QoS settings. However, - * once activated the immutable QoS settings can no longer be changed. - * - * Creating disabled entities can make sense when the creator of the Entity does not - * yet know which QoS settings to apply, thus allowing another piece of code to set the - * QoS later on. - * - * The default setting of dds::core::policy::EntityFactory is such that, - * by default, it is not necessary to explicitly call enable on newly- - * created entities. - * - * The enable operation is idempotent. Calling enable on an already- - * enabled Entity does not raise exceptions and has no effect. - * - * If an Entity has not yet been enabled, the only operations that can be invoked on it - * are: the ones to set, get or copy the QosPolicy settings, the ones that set (or get) the - * listener, the ones that get the StatusCondition, the get_status_changes - * operation (although the status of a disabled entity never changes), and the ‘factory’ - * operations that create, delete or lookup other Entities. Other operations will - * throw the exception dds::core::NotEnabledError. - * - * Entities created from a factory that is disabled are created - * disabled regardless of the setting of the dds::core::policy::EntityFactory - * Qos policy. Calling enable on an Entity whose factory is not - * enabled will fail and throw an dds::core::PreconditionNotMetError - * exception. - * - * If the dds::core::policy::EntityFactory QoS policy has autoenable_created_entities - * set to TRUE, the enable operation on the factory will automatically - * enable all entities created from the factory. - * - * The Listeners associated with an entity are not called until - * the entity is enabled. Conditions associated with an entity that - * is not enabled are inactive; that is, they have a trigger_value==false - * (dds::core::cond::Condition and dds::core::cond::WaitSet). - * - * eg. - * @code{.cpp} - * dds::domain::qos::DomainParticipantQos dpq; - * dpq << dds::core::policy::EntityFactory::ManuallyEnable(); - * ... - * dds::sub::DataReader dr(dp, topic, drqos); - * dr.enable(); - * @endcode - * - * In addition to the general description, the enable operation on a dds::sub::Subscriber - * has special meaning in specific usecases. This applies only to Subscribers with PresentationQoS - * coherent-access set to true with access-scope set to group. - * - * In this case the subscriber is always created in a disabled state, regardless of the auto-enable - * created entities setting on the corresponding participant. While the subscriber remains disabled, - * DataReaders can be created that will participate in coherent transactions of the subscriber. - * - * See dds::sub::CoherentAccess for more information. - * - * All DataReaders will also be created in a disabled state. Coherency with group access-scope requires - * data to be delivered as a transaction, atomically, to all eligible readers. Therefore data should not be - * delivered to any single DataReader immediately after it's created, as usual, but only after the application - * has finished creating all DataReaders for a given Subscriber. At this point, the application should enable the - * Subscriber which in turn enables all its DataReaders. - * - * Note that for a dds::pub::DataWriter which has a corresponding dds::pub::Publisher - * with a PresentationQoS with coherent-access set to true and access-scope set to topic or group - * that the HistoryQoS of the dds::pub::DataWriter should be set to keep-all otherwise the enable operation - * will fail. - * - * See dds::pup::DataWriter for more information. - * - * @return void - * @throw dds::core::PreconditionNotMetError - * Entities' factory is not enabled. - */ - OMG_DDS_API void enable() - { - this->delegate()->enable(); - } - - /** - * This operation returns a mask with the communication statuses in the Entity that - * are “triggered”. - * - * This operation retrieves the list of communication statuses in the Entity - * that are triggered. That is the set of communication statuses whose value have changed - * since the last time the application called this operation. This operation shows - * whether a change has occurred even when the status seems unchanged because the - * status changed back to the original status. - * - * When the Entity is first created or if the Entity is not enabled, all - * communication statuses are in the “un-triggered” state so the mask returned by the - * operation is empty. - * - * The result value is a bit mask in which each bit shows which value has changed. The - * relevant bits represent one of the following statuses: - * - dds::core::status::StatusMask::inconsistent_topic() - * - dds::core::status::StatusMask::offered_deadline_missed() - * - dds::core::status::StatusMask::requested_deadline_missed() - * - dds::core::status::StatusMask::offered_incompatible_qos() - * - dds::core::status::StatusMask::requested_incompatible_qos() - * - dds::core::status::StatusMask::sample_lost() - * - dds::core::status::StatusMask::sample_rejected() - * - dds::core::status::StatusMask::data_on_readers() - * - dds::core::status::StatusMask::data_available() - * - dds::core::status::StatusMask::liveliness_lost() - * - dds::core::status::StatusMask::liveliness_changed() - * - dds::core::status::StatusMask::publication_matched() - * - dds::core::status::StatusMask::subscription_matched() - * - dds::core::status::StatusMask::all_data_disposed_topic() - * - * Each status bit is declared as a constant and can be used in an AND operation to - * check the status bit against the result of type StatusMask. Not all statuses are - * relevant to all Entity objects. See the respective Listener interfaces for each - * Entity for more information. - * - * The list of statuses returned by the status_changes operation refers - * to the statuses that are triggered on the Entity itself, and does not - * include statuses that apply to contained entities. - * - * @return dds::core::status::StatusMask - * a bit mask in which each bit shows which value has changed. - */ - OMG_DDS_API const dds::core::status::StatusMask status_changes() - { - return this->delegate()->get_status_changes(); - } - - /** - * This operation returns the InstanceHandle_t that represents the Entity. - * - * The relevant state of some Entity objects are distributed using built-in topics. - * Each built-in topic sample represents the state of a specific Entity and has a - * unique instance_handle. This operation returns the instance_handle of the - * built-in topic sample that represents the specified Entity.
    - * Some Entities (dds::pub::Publisher and dds::sub::Subscriber) do not have a corresponding - * built-in topic sample, but they still have an instance_handle that uniquely - * identifies the Entity. The instance_handles obtained this way can also be used - * to check whether a specific Entity is located in a specific DomainParticipant - * (dds::domain::DomainParticipant::contains_entity()). - * - * @return dds::core::InstanceHandle - * Result value is the instance_handle of the built-in topic - * sample that represents the state of this Entity. - */ - OMG_DDS_API const InstanceHandle instance_handle() const - { - return this->delegate()->get_instance_handle(); - } - - /** - * This function closes the entity and releases related resources. - * - * Resource management for some reference types might involve relatively heavyweight - * operating- system resources — such as e.g., threads, mutexes, and network sockets — - * in addition to memory. These objects therefore provide a method close() that shall - * halt network communication (in the case of entities) and dispose of any appropriate - * operating-system resources. - * - * Users of this PSM are recommended to call close on objects of all reference types once - * they are finished using them. In addition, implementations may automatically close - * objects that they deem to be no longer in use, subject to the following restrictions: - * - Any object to which the application has a direct reference is still in use. - * - Any object that has been explicitly retained is still in use - * - The creator of any object that is still in use is itself still in use. - * - * @return void - */ - OMG_DDS_API void close() - { - this->delegate()->close(); - } - - /** - * Retain the Entity, even when it goes out of scope. - * - * This function indicates that references to this object may go out of - * scope but that the application expects to look it up again later. - * Therefore the Service must consider this object to be still in use - * and may not close it automatically. - * - * @return void - */ - OMG_DDS_API void retain() - { - // this->delegate()->retain(); - } - -}; - -typedef dds::core::detail::Entity Entity; - -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_ENTITY_HPP_ diff --git a/include/dds/core/EntityQos.hpp b/include/dds/core/EntityQos.hpp deleted file mode 100644 index 026d0800d5b..00000000000 --- a/include/dds/core/EntityQos.hpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_TDDS_CORE_QOS_ENTITY_QOS_HPP_ -#define OMG_TDDS_CORE_QOS_ENTITY_QOS_HPP_ - -#include - - -namespace dds { -namespace core { -template -class TEntityQos; - -/** - * @brief - * QoS Container - * - * Acts as a container for Qos policies allowing all the policies of - * an entity to be set and retrieved as a unit. - * - * For more information see \ref DCPS_Modules_Infrastructure "Infrastructure Module" - * and \ref DCPS_QoS "Supported Quality of Service" - */ -template -class TEntityQos : public Value -{ -public: - - /** - * Create default QoS. - */ - TEntityQos(); - - /** - * Create copied QoS. - * - * @param other the QoS to copy. - */ - TEntityQos( - const TEntityQos& other); - - /** - * Create/copy QoS from different QoS type. - * - * @param qos the QoS to copy policies from. - */ - template - TEntityQos( - const TEntityQos& qos); - -public: - - /** @cond */ - ~TEntityQos(); - /** @endcond */ - -public: - - /** - * Generic function for setting a policy applicable to this QoS object. - * Available policies depend on the actual instantiation of the template - * class, which might be DomainParticipantQos, TopicQos, PublisherQos, etc. - * - * @param p the policy to be set for this QoS instance. - */ - template - TEntityQos& policy( - const POLICY& p); - - /** - * Generic function for obtaining the value of a specific policy - * belonging to this QoS instance. - * - * @return policy - */ - template - const POLICY& policy() const; - - /** - * Generic function for obtaining the value of a specific policy - * belonging to this QoS instance. - * - * @return policy - */ - template - POLICY& policy(); - - /** - * Generic function for setting a policy applicable to this QoS object. - * Available policies depend on the actual instantiation of the template - * class, which might be DomainParticipantQos, TopicQos, PublisherQos, etc. - * - * @param p the policy to be set for this QoS instance. - */ - template - TEntityQos& operator <<( - const POLICY& p); - - /** - * Generic function for obtaining the value of a specific policy - * belonging to this QoS instance. - * - * @return policy - */ - template - const TEntityQos& operator >>( - POLICY& p) const; - - /** - * Generic function for setting a policy applicable to this QoS object. - * Available policies depend on the actual instantiation of the template - * class, which might be DomainParticipantQos, TopicQos, PublisherQos, etc. - * - * @param TEntityQos the TEntityQos to set - */ - template - TEntityQos& operator =( - const TEntityQos& other); - -}; - -} //namespace core -} //namespace dds - -#endif //OMG_TDDS_CORE_QOS_ENTITY_QOS_HPP_ diff --git a/include/dds/core/Exception.hpp b/include/dds/core/Exception.hpp deleted file mode 100644 index 003912179e8..00000000000 --- a/include/dds/core/Exception.hpp +++ /dev/null @@ -1,479 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_EXCEPTION_HPP_ -#define OMG_DDS_CORE_EXCEPTION_HPP_ - -#include - -#include -#include - -#if defined _MSC_VER -# pragma warning (push) -# pragma warning (disable:4275) // non dll-interface class 'std::foo_error' used as base for dll-interface class 'dds::core::BarError' -#endif - -namespace dds { -namespace core { - -/** - * @brief - * %Exception: base class for specified DDS Exceptions. - * - * DDS PIM Return Code | DDS-PSM-CXX Exception Class | std C++ Parent Exception - * ------------------- | --------------------------- | ------------------------ - * RETCODE_OK | Normal return; no exception | N/A - * RETCODE_NO_DATA | Normal return with informational state attached | N/A - * RETCODE_ERROR | Error | std::logic_error - * RETCODE_BAD_PARAMETER | InvalidArgumentError | std::invalid_argument - * RETCODE_TIMEOUT | TimeoutError | std::runtime_error - * RETCODE_UNSUPPORTED | UnsupportedError | std::logic_error - * RETCODE_ALREADY_DELETED | AlreadyClosedError | std::logic_error - * RETCODE_ILLEGAL_OPERATION | IllegalOperationError | std::logic_error - * RETCODE_NOT_ENABLED | NotEnabledError | std::logic_error - * RETCODE_PRECONDITION_NOT_MET | PreconditionNotMetError | std::logic_error - * RETCODE_IMMUTABLE_POLICY | ImmutablePolicyError | std::logic_error - * RETCODE_INCONSISTENT_POLICY | InconsistentPolicyError | std::logic_error - * RETCODE_OUT_OF_RESOURCES | OutOfResourcesError | std::runtime_error - * - * The DDS-PSM-Cxx maps error codes to C++ exceptions defined in the dds::core namespace and - * inheriting from a base Exception class and the appropriate standard C++ exception. - * Table 7.3 lists the mapping between error codes as defined in the DDS PIM and C++ exceptions - * as used in this specification. Exceptions have value semantics; this means that they must - * always have deep copy semantics. - * The full list of exceptions is included in the file dds/core/Exceptions.hpp. - * - */ -class Exception -{ -protected: - - OMG_DDS_API Exception() - { - } - -public: - - /** @cond */ - OMG_DDS_API virtual ~Exception() throw() - { - } - - /** @endcond */ - -public: - - /** - * Retrieve information about the exception that was thrown. - * - * Example - * @code{.cpp} - * try { - * // Do something that will trigger a dds exception, like: - * dds::domain::DomainParticipant participant = dds::core::null; - * participant.domain_id(); - * } catch (const dds::core::Exception& e) { - * std::cout << e.what() << std::endl; - * } - * @endcode - * %Exception information (of the NullReferenceError in this case) - * @code - * Null reference: Reference[157] == dds::core::null - * ======================================================================================== - * Context : dds::domain::DomainParticipant::domain_id - * Date : Wed Oct 21 19:28:00 CET 2015 - * Node : DeLorean - * Process : flux_capacitor <15423> - * Thread : mr_fusion b6f25700 - * Internals : ReferenceImpl.hpp/157/V6.6.0 - * ---------------------------------------------------------------------------------------- - * Report : Null reference: Reference[157] == dds::core::null - * Internals : dds::core::Reference::delegate/ReferenceImpl.hpp/157 - * @endcode - * - * @return Exception information - */ - OMG_DDS_API virtual const char* what() const throw() = 0; -}; - -/** - * @brief - * %Exception: Generic, unspecified error. - */ -class Error : public Exception, public std::logic_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit Error( - const std::string& msg); - - OMG_DDS_API Error( - const Error& src); - - OMG_DDS_API virtual ~Error() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -/** - * @brief - * %Exception: The object target of this operation has already been closed. - */ -class AlreadyClosedError : public Exception, public std::logic_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit AlreadyClosedError( - const std::string& msg); - - OMG_DDS_API AlreadyClosedError( - const AlreadyClosedError& src); - - OMG_DDS_API virtual ~AlreadyClosedError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -/** - * @brief - * %Exception: An operation was invoked on an inappropriate object or at an inappropriate time. - * - * This is determined by policies set by the specification or the Service implementation. - * - * There is no precondition that could be changed to make the operation succeed. - */ -class IllegalOperationError : public Exception, public std::logic_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit IllegalOperationError( - const std::string& msg); - - OMG_DDS_API IllegalOperationError( - const IllegalOperationError& src); - - OMG_DDS_API virtual ~IllegalOperationError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -/** - * @brief - * %Exception: Application attempted to modify an immutable QosPolicy. - */ -class ImmutablePolicyError : public Exception, public std::logic_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit ImmutablePolicyError( - const std::string& msg); - - OMG_DDS_API ImmutablePolicyError( - const ImmutablePolicyError& src); - - OMG_DDS_API virtual ~ImmutablePolicyError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -/** - * @brief - * %Exception: Application specified a set of policies that are not - * consistent with each other. - */ -class InconsistentPolicyError : public Exception, public std::logic_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit InconsistentPolicyError( - const std::string& msg); - - OMG_DDS_API InconsistentPolicyError( - const InconsistentPolicyError& src); - - OMG_DDS_API virtual ~InconsistentPolicyError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -/** - * @brief - * %Exception: Application is passing an invalid argument. - */ -class InvalidArgumentError : public Exception, public std::invalid_argument -{ - /** @cond */ - -public: - - OMG_DDS_API explicit InvalidArgumentError( - const std::string& msg); - - OMG_DDS_API InvalidArgumentError( - const InvalidArgumentError& src); - - OMG_DDS_API virtual ~InvalidArgumentError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -/** - * @brief - * %Exception: Operation invoked on an Entity that is not yet enabled. - */ -class NotEnabledError : public Exception, public std::logic_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit NotEnabledError( - const std::string& msg); - - OMG_DDS_API NotEnabledError( - const NotEnabledError& src); - - OMG_DDS_API virtual ~NotEnabledError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -/** - * @brief - * %Exception: Service ran out of the resources needed to complete the - * operation. - */ -class OutOfResourcesError : public Exception, public std::runtime_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit OutOfResourcesError( - const std::string& msg); - - OMG_DDS_API OutOfResourcesError( - const OutOfResourcesError& src); - - OMG_DDS_API virtual ~OutOfResourcesError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - - -/** - * @brief - * %Exception: A pre-condition for the operation was not met. - */ -class PreconditionNotMetError : public Exception, public std::logic_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit PreconditionNotMetError( - const std::string& msg); - - OMG_DDS_API PreconditionNotMetError( - const PreconditionNotMetError& src); - - OMG_DDS_API virtual ~PreconditionNotMetError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -/** - * @brief - * %Exception: The operation timed out. - */ -class TimeoutError : public Exception, public std::runtime_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit TimeoutError( - const std::string& msg); - - OMG_DDS_API TimeoutError( - const TimeoutError& src); - - OMG_DDS_API virtual ~TimeoutError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -/** - * @brief - * %Exception: Unsupported operation. - * - * This can only be thrown by operations that are optional. - */ -class UnsupportedError : public Exception, public std::logic_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit UnsupportedError( - const std::string& msg); - - OMG_DDS_API UnsupportedError( - const UnsupportedError& src); - - OMG_DDS_API virtual ~UnsupportedError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -/** - * @brief - * %Exception: Application has attempted to cast incompatible types. - */ -class InvalidDowncastError : public Exception, public std::runtime_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit InvalidDowncastError( - const std::string& msg); - - OMG_DDS_API InvalidDowncastError( - const InvalidDowncastError& src); - - OMG_DDS_API virtual ~InvalidDowncastError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -/** - * @brief - * %Exception: Application used a null reference. - * - * Very likely, the used DDS object is a dds::core::null object. - * @code{.cpp} - * dds::domain::DomainParticipant participant = dds::core::null; - * try { - * participant.domain_id(); - * } catch (const dds::core::NullReferenceError& e) { - * std::cout << e.what() << std::endl; - * } - * @endcode - */ -class NullReferenceError : public Exception, public std::runtime_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit NullReferenceError( - const std::string& msg); - - OMG_DDS_API NullReferenceError( - const NullReferenceError& src); - - OMG_DDS_API virtual ~NullReferenceError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -/** - * @brief - * %Exception: Application provided invalid data - */ -class InvalidDataError : public Exception, public std::logic_error -{ - /** @cond */ - -public: - - OMG_DDS_API explicit InvalidDataError( - const std::string& msg); - - OMG_DDS_API InvalidDataError( - const InvalidDataError& src); - - OMG_DDS_API virtual ~InvalidDataError() throw(); - -public: - - OMG_DDS_API virtual const char* what() const throw(); - /** @endcond */ -}; - -} //namespace core -} //namespace dds - -#if defined _MSC_VER -# pragma warning (pop) -#endif - -#endif //OMG_DDS_CORE_EXCEPTION_HPP_ - diff --git a/include/dds/core/InstanceHandle.hpp b/include/dds/core/InstanceHandle.hpp deleted file mode 100644 index 50be1bcd824..00000000000 --- a/include/dds/core/InstanceHandle.hpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_INSTANCE_HANDLE_HPP_ -#define OMG_DDS_CORE_INSTANCE_HANDLE_HPP_ - -#include -#include - -#include -#include - -#include - -namespace dds { -namespace core { - -/** - * @brief - * Class to hold the handle associated with in sample instance. - */ -class InstanceHandle : public Value -{ -public: - - /** - * Create an nil instance handle. - */ - OMG_DDS_API InstanceHandle(); - - /** - * Create an nil instance handle. - * - * @param nullHandle placeholder - */ - OMG_DDS_API InstanceHandle( - const null_type& nullHandle); - - - /** - * Copy an existing InstancHandle - * - * @param other InstanceHandle to copy - */ - OMG_DDS_API InstanceHandle( - const InstanceHandle& other); - - /** @cond */ - OMG_DDS_API ~InstanceHandle(); - /** @endcond */ - - /** - * @cond - * Parametric constructor for creating an instance-handle - * from some other type. This function is intended for internal - * usage. - */ - OMG_DDS_API InstanceHandle( - const detail::InstanceHandle& arg0); - /** @endcond */ - -public: - - /** - * Assign an existing InstancHandle to this InstancHandle - * - * @param that The InstanceHandle to assign to this - */ - OMG_DDS_API InstanceHandle& operator =( - const InstanceHandle& that); - - /** - * Compare this InstanceHandle to another InstanceHandle - * - * @param that The InstanceHandle to compare - * @return true if they match - */ - OMG_DDS_API bool operator ==( - const InstanceHandle& that) const; - - /** - * Compare this InstanceHandle to another InstanceHandle - * - * @param that The InstanceHandle to compare - * @return true if this is less than that - */ - OMG_DDS_API bool operator <( - const InstanceHandle& that) const; - - /** - * Compare this InstanceHandle to another InstanceHandle - * - * @param that The InstanceHandle to compare - * @return true if this is greater than that - */ - OMG_DDS_API bool operator >( - const InstanceHandle& that) const; - -public: - - /** - * Create an nil instance handle. - * - * @return a nil InstanceHandle - */ - OMG_DDS_API static const InstanceHandle nil(); - - /** - * Check if the InstanceHandle is nil. - * - * @return true if the InstanceHandle is nil - */ - OMG_DDS_API bool is_nil() const; -}; - -typedef std::vector InstanceHandleSeq; - -} //namespace core -} //namespace dds - -inline std::ostream& operator <<( - std::ostream& os, - const dds::core::InstanceHandle& h); - - -#endif //OMG_DDS_CORE_INSTANCE_HANDLE_HPP_ diff --git a/include/dds/core/LengthUnlimited.hpp b/include/dds/core/LengthUnlimited.hpp deleted file mode 100644 index 1199cdd2dda..00000000000 --- a/include/dds/core/LengthUnlimited.hpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_LENGTH_UNLIMITED_HPP_ -#define OMG_DDS_CORE_LENGTH_UNLIMITED_HPP_ - -#include - -namespace dds { -namespace core { - -const uint32_t LENGTH_UNLIMITED = 0; - -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_LENGTH_UNLIMITED_HPP_ diff --git a/include/dds/core/Optional.hpp b/include/dds/core/Optional.hpp deleted file mode 100644 index 0225998cd43..00000000000 --- a/include/dds/core/Optional.hpp +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_OPTIONAL_HPP_ -#define OMG_DDS_CORE_OPTIONAL_HPP_ - -#include - -namespace dds { -namespace core { - -/** - * The optional class is used to wrap attributes annotated in the idl with the - * \@optional annotation. This class provides a simple and safe way of - * accessing, setting and resetting the stored attribute. - * - * IDL: - * @code - * struct RadarTrack { - * string id; - * long x; - * long y; - * long z; //@Optional - * }; - * @endcode - * - * C++ Representation: - * @code{.cpp} - * class RadarTrack { - * public: - * RadarTrack(); - * RadarTrack(const std::string& id, - * int32_t x, - * int32_t y, - * int32_t z); - * public: - * std::string& id() const; - * void id(const std::string& s); - * - * int32_t x() const; - * void x(int32_t v); - * - * int32_t y() const; - * void y(int32_t v); - * - * dds::core::optional& z() const; - * void z(int32_t v); - * void z(const dds::core::optional& z) - * }; - * @endcode - */ -template< - typename T, - template class DELEGATE> -class optional : public dds::core::Value< DELEGATE > -{ -public: - - optional( - const T& t); - -public: - - /** - * Returns true only if the attribute is set. - */ - bool is_set() const; - - /** - * Reset the attribute. - */ - void reset(); - - /** - * Get the attribute. An exception is thrown if the attribute is not set. - */ - const T& get() const; - - /** - * Get the attribute. An exception is thrown if the attribute is not set. - */ - T& get(); -}; - -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_OPTIONAL_HPP_ diff --git a/include/dds/core/QosProvider.hpp b/include/dds/core/QosProvider.hpp deleted file mode 100644 index 9b22297e9da..00000000000 --- a/include/dds/core/QosProvider.hpp +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_QOS_PROVIDER_HPP_ -#define OMG_DDS_CORE_QOS_PROVIDER_HPP_ - -#include - -//#include - -//#include - -//#include -//#include - -//#include -//#include - -#include - - -namespace dds { -namespace core { - -/** - * @brief - * The QosProvider API allows users to specify the QoS settings of their DCPS - * entities outside of application code in XML. - * - * The QosProvider is delivered as part of the DCPS API of Vortex OpenSplice. - * - * @see @ref DCPS_QoS_Provider "QoS Provider extensive information." - */ -template -class TQosProvider : public Reference -{ -public: - - /** - * Constructs a new QosProvider based on the provided uri and profile. - * - * A QosProvider instance that is instantiated with all profiles and/or QoS’s loaded - * from the location specified by the provided uri. - * - * Initialization of the QosProvider will fail under the following conditions:
    - * - No uri is provided. - * - The resource pointed to by uri cannot be found. - * - The content of the resource pointed to by uri is malformed (e.g., malformed XML). - * When initialization fails (for example, due to a parse error or when the resource - * identified by uri cannot be found), then PreconditionNotMetError will be thrown. - * - * Look @ref DCPS_QoS_Provider "here" for more information. - * - * @param uri A Uniform Resource Identifier (URI) that points to the location - * where the QoS profile needs to be loaded from. Currently only URI’s with a - * ‘file’ scheme that point to an XML file are supported. If profiles and/or QoS - * settings are not uniquely identifiable by name within the resource pointed to by - * uri, a random one of them will be stored. - * @param profile The name of the QoS profile within the xml file that serves as the default QoS - * profile for the get qos operations. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * When multiple thread try to invoke the function concurrently. - */ - explicit TQosProvider( - const std::string& uri, - const std::string& profile); - - /** - * Constructs a new QosProvider based on the provided uri. - * - * A QosProvider instance that is instantiated with all profiles and/or QoS’s loaded - * from the location specified by the provided uri. - * - * Initialization of the QosProvider will fail under the following conditions:
    - * - No uri is provided. - * - The resource pointed to by uri cannot be found. - * - The content of the resource pointed to by uri is malformed (e.g., malformed XML). - * When initialization fails (for example, due to a parse error or when the resource - * identified by uri cannot be found), then PreconditionNotMetError will be thrown. - * - * Look @ref DCPS_QoS_Provider "here" for more information. - * - * @param uri A Uniform Resource Identifier (URI) that points to the location - * where the QoS profile needs to be loaded from. Currently only URI’s with a - * ‘file’ scheme that point to an XML file are supported. If profiles and/or QoS - * settings are not uniquely identifiable by name within the resource pointed to by - * uri, a random one of them will be stored. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * When multiple thread try to invoke the function concurrently. - */ - explicit TQosProvider( - const std::string& uri); - - /** - * Resolves the DomainParticipantQos from the uri this QosProvider is associated with. - * - * @return DomainParticipantQos from the given URI (and profile) - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * If no DomainParticipantQos can be found within the uri associated - * with the QosProvider. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - dds::domain::qos::DomainParticipantQos participant_qos(); - - /** - * Resolves the DomainParticipantQos identified by the id from the uri this - * QosProvider is associated with. - * - * @param id The fully-qualified name that identifies a QoS within the uri - * associated with the QosProvider or a name that identifies a QoS within the - * uri associated with the QosProvider instance relative to its default QoS - * profile. Id’s starting with ‘::’ are interpreted as fully-qualified names and all - * others are interpreted as names relative to the default QoS profile of the - * QosProvider instance. When id is NULL it is interpreted as a non-named QoS - * within the default QoS profile associated with the QosProvider. - * @return DomainParticipantQos from the given URI (and profile) using the id - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * If no DomainParticipantQos that matches the provided id can be - * found within the uri associated with the QosProvider. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - dds::domain::qos::DomainParticipantQos participant_qos( - const std::string& id); - - /** - * Resolves the TopicQos from the uri this QosProvider is associated with. - * - * @return TopicQos from the given URI (and profile) - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * If no TopicQos can be found within the uri associated - * with the QosProvider. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - dds::topic::qos::TopicQos topic_qos(); - - /** - * Resolves the TopicQos identified by the id from the uri this - * QosProvider is associated with. - * - * @param id The fully-qualified name that identifies a QoS within the uri - * associated with the QosProvider or a name that identifies a QoS within the - * uri associated with the QosProvider instance relative to its default QoS - * profile. Id’s starting with ‘::’ are interpreted as fully-qualified names and all - * others are interpreted as names relative to the default QoS profile of the - * QosProvider instance. When id is NULL it is interpreted as a non-named QoS - * within the default QoS profile associated with the QosProvider. - * @return TopicQos from the given URI (and profile) using the id - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * If no TopicQos that matches the provided id can be - * found within the uri associated with the QosProvider. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - dds::topic::qos::TopicQos topic_qos( - const std::string& id); - - /** - * Resolves the SubscriberQos from the uri this QosProvider is associated with. - * - * @return SubscriberQos from the given URI (and profile) - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * If no SubscriberQos can be found within the uri associated - * with the QosProvider. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - dds::sub::qos::SubscriberQos subscriber_qos(); - - /** - * Resolves the SubscriberQos identified by the id from the uri this - * QosProvider is associated with. - * - * @param id The fully-qualified name that identifies a QoS within the uri - * associated with the QosProvider or a name that identifies a QoS within the - * uri associated with the QosProvider instance relative to its default QoS - * profile. Id’s starting with ‘::’ are interpreted as fully-qualified names and all - * others are interpreted as names relative to the default QoS profile of the - * QosProvider instance. When id is NULL it is interpreted as a non-named QoS - * within the default QoS profile associated with the QosProvider. - * @return SubscriberQos from the given URI (and profile) using the id - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * If no SubscriberQos that matches the provided id can be - * found within the uri associated with the QosProvider. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - dds::sub::qos::SubscriberQos subscriber_qos( - const std::string& id); - - /** - * Resolves the DataReaderQos from the uri this QosProvider is associated with. - * - * @return DataReadertQos from the given URI (and profile) - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * If no DataReaderQos can be found within the uri associated - * with the QosProvider. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - dds::sub::qos::DataReaderQos datareader_qos(); - - /** - * Resolves the DataReaderQos identified by the id from the uri this - * QosProvider is associated with. - * - * @param id The fully-qualified name that identifies a QoS within the uri - * associated with the QosProvider or a name that identifies a QoS within the - * uri associated with the QosProvider instance relative to its default QoS - * profile. Id’s starting with ‘::’ are interpreted as fully-qualified names and all - * others are interpreted as names relative to the default QoS profile of the - * QosProvider instance. When id is NULL it is interpreted as a non-named QoS - * within the default QoS profile associated with the QosProvider. - * @return DataReaderQos from the given URI (and profile) using the id - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * If no DataReaderQos that matches the provided id can be - * found within the uri associated with the QosProvider. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - dds::sub::qos::DataReaderQos datareader_qos( - const std::string& id); - - /** - * Resolves the PublisherQos from the uri this QosProvider is associated with. - * - * @return PublisherQos from the given URI (and profile) - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * If no PublisherQos can be found within the uri associated - * with the QosProvider. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - dds::pub::qos::PublisherQos publisher_qos(); - - /** - * Resolves the PublisherQos identified by the id from the uri this - * QosProvider is associated with. - * - * @param id The fully-qualified name that identifies a QoS within the uri - * associated with the QosProvider or a name that identifies a QoS within the - * uri associated with the QosProvider instance relative to its default QoS - * profile. Id’s starting with ‘::’ are interpreted as fully-qualified names and all - * others are interpreted as names relative to the default QoS profile of the - * QosProvider instance. When id is NULL it is interpreted as a non-named QoS - * within the default QoS profile associated with the QosProvider. - * @return PublisherQos from the given URI (and profile) using the id - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * If no PublisherQos that matches the provided id can be - * found within the uri associated with the QosProvider. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - dds::pub::qos::PublisherQos publisher_qos( - const std::string& id); - - /** - * Resolves the DataWriterQos from the uri this QosProvider is associated with. - * - * @return DataWriterQos from the given URI (and profile) - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * If no DataWriterQos can be found within the uri associated - * with the QosProvider. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - dds::pub::qos::DataWriterQos datawriter_qos(); - - /** - * Resolves the DataWriterQos identified by the id from the uri this - * QosProvider is associated with. - * - * @param id The fully-qualified name that identifies a QoS within the uri - * associated with the QosProvider or a name that identifies a QoS within the - * uri associated with the QosProvider instance relative to its default QoS - * profile. Id’s starting with ‘::’ are interpreted as fully-qualified names and all - * others are interpreted as names relative to the default QoS profile of the - * QosProvider instance. When id is NULL it is interpreted as a non-named QoS - * within the default QoS profile associated with the QosProvider. - * @return DataWriterQos from the given URI (and profile) using the id - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::PreconditionNotMetError - * If no DataWriterQos that matches the provided id can be - * found within the uri associated with the QosProvider. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - dds::pub::qos::DataWriterQos datawriter_qos( - const std::string& id); -}; - -typedef dds::core::detail::QosProvider QosProvider; - -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_QOS_PROVIDER_HPP_ diff --git a/include/dds/core/Reference.hpp b/include/dds/core/Reference.hpp deleted file mode 100644 index f93cdcdeae5..00000000000 --- a/include/dds/core/Reference.hpp +++ /dev/null @@ -1,485 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_REFERENCE_HPP_ -#define OMG_DDS_CORE_REFERENCE_HPP_ - -#include -#include -#include //used when macros of refmacros.hpp expand - -namespace dds { -namespace core { - -/** - * @brief - * Base class for reference-counted objects. - * - * All objects that have a reference-type have an associated shallow (polymorphic) - * assignment operator that simply changes the value of the reference. - * Furthermore, reference-types are safe, meaning that under no circumstances can - * a reference point to an invalid object. - * At any single point in time a reference can either refer to the null object or - * to a valid object. - * - * The semantics for Reference types is defined by the DDS-PSM-Cxx class - * dds::core::Reference. In the context of this specification the semantics implied - * by the ReferenceType is mandatory, yet the implementation supplied as part of - * this standard is provided to show one possible way of implementing this semantics. - * - * List of reference types: - * - * * Entity - * * Condition - * * GuardCondition - * * ReadCondition - * * QueryCondition - * * Waitset - * * DomainParticipant - * * AnyDataWriter - * * Publisher - * * DataWriter - * * AnyDataReader - * * Subscriber - * * DataReader - * * SharedSamples - * * AnyTopic - * * Topic - * - * Instances of reference types are created using C++ constructors. - * The trivial constructor is not defined for reference types; the only - * alternative to properly constructing a reference is to initialize it to a - * null reference by assigning dds::core::null. - * - * Resource management for some reference types might involve relatively - * heavyweight operating-system resources (such as threads, mutexes, - * and network sockets) in addition to memory. - * These objects therefore provide a function close() that shall halt network - * communication (in the case of entities) and dispose of any appropriate - * operating-system resources. - * - * Users of this PSM are recommended to call close on objects of all reference - * types once they are finished using them. In addition, implementations may - * automatically close objects that they deem to be no longer in use, - * subject to the following restrictions: - * - * * Any object to which the application has a direct reference - * (not including a WeakReference) is still in use. - * - * * Any object that has been explicitly retained is still in use. - * - * * The creator of any object that is still in use is itself still in use. - * - */ -template -class Reference -{ -public: - - DECLARE_TYPE_TRAITS( - DELEGATE) - - /** - * Creates a "null" Reference. - * - * @param null - */ - explicit Reference( - dds::core::null_type& n) - : impl_(n) - { - } - - /** - * Creates a Reference from another. - * - * @param ref the other reference - */ - explicit Reference( - const Reference& ref) - : impl_(ref.impl_) - { - } - - /** - * Assign a Reference from another. - * - * @param ref the other reference - */ - Reference& operator = ( - const Reference& ref) - { - impl_ = ref.impl_; - return *this; - } - - /** - * Creates a Reference from other Reference type safely. - * - * @param ref the other reference - */ - template - explicit Reference( - const Reference& ref) - { - impl_ = std::dynamic_pointer_cast(ref.impl_); - if (impl_ != ref.impl_) - { - throw - IllegalOperationError(std::string("Attempted invalid cast: ") + - typeid(ref).name() + " to " + typeid(*this).name()); - } - - } - - /** @cond - * The following two constructors create a dds Reference from a vendor - * specific delegate. - * - * They are public, because the implementation of other delegates may - * need to be able to create References in that manner. - * - * However, it shouldn't actually be part of the API. So, leave it from - * the doxygen generated API documentation. - */ - explicit Reference( - DELEGATE_T* p) - : impl_(p) - { - } - - explicit Reference( - const DELEGATE_REF_T& p) - : impl_(p) - { - } - - /** @endcond */ - - /** - * Destroys a Reference. - * - * There might be an associated garbage collection activity when - * the current reference is not empty. When the underlaying delegate - * is referenced by another Reference object as well, then that - * delegate will not be destroyed. - */ - ~Reference() - { - } - - /** @cond - * Function possibly needed for delegate implementation, but not recommended - * for application usage: exclude from the API documentation for clarity. - * - * Returns an object to the underlying delegate. - */ - operator DELEGATE_REF_T() const - { - return impl_; - } - /** @endcond */ - - /** - * Compares two Reference objects and returns true if they are equal. - * - * Equality is based on the referential equality of the object being - * pointed. - * - * @param ref the other Reference object - * @return true when equal - */ - template - bool operator ==( - const R& ref) const - { - bool equal = false; - if (this->is_nil() && ref.is_nil()) - { - /* Both delegates are null. */ - equal = true; - } - else if (!this->is_nil() && !ref.is_nil()) - { - /* Check delegates. */ - equal = (this->delegate() == ref.delegate()); - } - return equal; - } - - /** - * Compares two Reference objects and returns true if they are not - * equal. - * - * Inequality is based on the referential inequality of the object - * being pointed to. - * - * @param ref the other Reference object - * @return true when not equal - */ - template - bool operator !=( - const R& ref) const - { - // FRANAVA read something removing the this keyword. - return !(*this == ref); - } - - /** - * Assign new referenced object to this dds reference. - * - * There might be an associated garbage collection activity when - * the current reference is not empty. - * - * @return reference pointing to the new object. - */ - template - Reference& operator =( - const Reference& that) - { - //To implement - static_assert((is_base_of::value), "value error"); - if (this != (Reference*)&that) - { - *this = Reference(that); - } - return *this; - - } - - /** @copydoc dds::core::Reference::operator=(const Reference& that) */ - template - Reference& operator =( - const R& rhs) - { - static_assert( - is_base_of< DELEGATE_T, typename R::DELEGATE_T>::value, - "location: operator=()" ); - if (this != (Reference*)&rhs) - { - *this = Reference(rhs); - } - return *this; - - } - - /** - * Special assignment operators that takes care of assigning - * dds::core::null to this reference. - * - * When assigning null, there might be an associated garbage collection - * activity. - * - * @return reference pointing to a null object. - */ - - Reference& operator =( - const null_type nil) - { - this = nil; - return this; - } - - /** - * Check if the referenced object is nil. - * - * In other words, check if the reference is pointing to a null object. - * - * @return true if the referenced object is null. - */ - bool is_nil() const - { - return impl_.get() == 0; - } - - /** - * Special operator== used to check if this reference object - * equals the dds::core::null reference. - * - * The null-check can be done like this: - * @code{.cpp} - * if (r == dds::core::null) { - * // Do not use the dds reference object r in its current state - * } - * @endcode - * - * @return true if this reference is null. - */ - bool operator ==( - const null_type) const - { - return this->is_nil(); - } - - /** - * Special operator!= used to check if this reference object - * does not equal the dds::core::null reference. - * - * The non-null-check can be done like this: - * @code{.cpp} - * if (r != dds::core::null) { - * // Use the dds reference object r - * } - * @endcode - * - * @return true if this reference is not null. - */ - bool operator !=( - const null_type) const - { - return !(this->is_nil()); - } - -private: - - // -- disallow dynamic allocation for reference types - void* operator new( - size_t); - -public: - - /** @cond - * Functions possibly needed for delegate implementation, but not recommended - * for application usage: exclude from the API documentation for clarity. - * - * Returns an object to the underlying delegate. - */ - DELEGATE_REF_T& delegate() - { - return impl_; - } - - const DELEGATE_REF_T& delegate() const - { - return impl_; - } - - /** @endcond */ - - /** - * The operator->() is provided to be able to directly invoke - * functions on the delegate. - * - * The decision to provide direct access to - * the delegate was motivated by the need for providing a way that - * was not invasive with respect to the CXXDDS API and yet would allow - * for vendor-specific extension. - * Thus vendor-specific extensions can be invoked on the Reference - * and on all its subclasses as follows: - * @code{.cpp} - * my_dds_entity.standard_function(); - * my_dds_entity->vendor_specific_extension(); - * @endcode - * - * @return a reference to delegate. - */ - DELEGATE* operator ->() - { - return impl_.get(); - - } - - /** @copydoc dds::core::Reference::operator->() */ - const DELEGATE* operator ->() const - { - return impl_.get(); - } - - /** @cond - * Functions possibly needed for delegate implementation, but not recommended - * for application usage: exclude from the API documentation for clarity. - * - * Returns an object to the underlying delegate. - */ - operator DELEGATE_REF_T& () - { - return impl_; - } - - operator const DELEGATE_REF_T& () const - { - return impl_; - } - /** @endcond */ - -protected: - - Reference() - { - } - - void set_ref( - DELEGATE_T* p) - { - impl_.reset(p); - } - -protected: - - DELEGATE_REF_T impl_; -}; - - -} //namespace core -} //namespace dds - - -/** - * Special operator== used to check if this reference object - * does not equal the dds::core::null reference. - * - * The non-null-check can be done like this: - * @code{.cpp} - * if (dds::core::null == r) { - * // Do not use the dds reference object r in its current state - * } - * @endcode - * - * @return true if this reference is not null. - */ -template -bool operator ==( - dds::core::null_type, - const dds::core::Reference& r) -{ - return r.is_nil(); -} - -/** - * Special operator!= used to check if this reference object - * does not equal the dds::core::null reference. - * - * The non-null-check can be done like this: - * @code{.cpp} - * if (dds::core::null != r) { - * // Use the dds reference object r - * } - * @endcode - * - * @return true if this reference is not null. - */ -template -bool operator !=( - dds::core::null_type, - const dds::core::Reference& r) -{ - return !r.is_nil(); -} - -#endif // OMG_DDS_CORE_REFERENCE_HPP_ diff --git a/include/dds/core/SafeEnumeration.hpp b/include/dds/core/SafeEnumeration.hpp deleted file mode 100644 index 8dc6720dcb8..00000000000 --- a/include/dds/core/SafeEnumeration.hpp +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_SAFEENUMERATION_HPP_ -#define OMG_DDS_CORE_SAFEENUMERATION_HPP_ - -namespace dds { -namespace core { - -/** - * SafeEnum provides a wrapper for enumerated types in a typesafe - * manner. - * - * SafeEnums allow specification of the underlying type, - * do not implictly convert to integers, and resolve scoping issues. - */ -template< - typename Def, - typename Inner = typename Def::Type> -class SafeEnum : public Def -{ -public: - - constexpr SafeEnum( - Inner v) - : val(v) - { - } - - Inner underlying() const - { - return val; - } - - bool operator ==( - const SafeEnum& s) const - { - return this->val == s.val; - } - - bool operator !=( - const SafeEnum& s) const - { - return this->val != s.val; - } - - bool operator <( - const SafeEnum& s) const - { - return this->val < s.val; - } - - bool operator <=( - const SafeEnum& s) const - { - return this->val <= s.val; - } - - bool operator >( - const SafeEnum& s) const - { - return this->val > s.val; - } - - bool operator >=( - const SafeEnum& s) const - { - return this->val >= s.val; - } - -private: - - Inner val; - -}; - -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_SAFEENUMERATION_HPP_ - diff --git a/include/dds/core/Time.hpp b/include/dds/core/Time.hpp deleted file mode 100644 index ba4f3439662..00000000000 --- a/include/dds/core/Time.hpp +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_TIME_HPP_ -#define OMG_DDS_CORE_TIME_HPP_ - -#include - -namespace dds { -namespace core { - -class Duration; -class Time; - -/** - * Time represents a time value and can: - * - * * Be incremented by Duration expressed as seconds, - * nanoseconds, milliseconds, or Duration objects. - * - * * Be converted to and from Times expressed in - * milliseconds (or other units) as integer types. - */ -class OMG_DDS_API Time -{ -public: - - static const Time invalid(); // {-1, 0xffffffff} - - /** - * Create a Time from a number of microseconds - * - * @param microseconds number of microseconds - */ - static const Time from_microsecs( - int64_t microseconds); - - /** - * Create a Time from a number of milliseconds - * - * @param milliseconds number of miliseconds - */ - static const Time from_millisecs( - int64_t milliseconds); - - /** - * Create a Time from a number of seconds - * - * @param seconds number of seconds - */ - static const Time from_secs( - double seconds); - - /** - * Create a Time of zero seconds. - */ - Time(); - - /** - * Create a Time elapsing a specific amount of time. - */ - explicit Time( - int64_t sec, - uint32_t nanosec = 0); - - /** - * @return number of seconds - */ - int64_t sec() const; - - /** - * Set number of seconds - * @param s number of seconds - */ - void sec( - int64_t s); - - /** - * @return number of nanoseconds - */ - uint32_t nanosec() const; - - /** - * Set number of nanoseconds - * @param ns number of nanoseconds - */ - void nanosec( - uint32_t ns); - - /** - * Returns an integer indicating the result of a comparison - * of two Times: - * 1 if this Time is greater than the comparator (that) - * -1 if the Time is less than the comparator (that) - * 0 if the Time matches the comparator (that) - * - * @param that Time to compare - * @return comparison result - */ - int compare( - const Time& that) const; - - /** - * @param that Time to compare - * @return true if the Time is greater than the comparator - */ - bool operator >( - const Time& that) const; - - /** - * @param that Time to compare - * @return true if the Time is greater than or equal to the comparator - */ - bool operator >=( - const Time& that) const; - - /** - * @param that Time to compare - * @return true if the Time is not equal to the comparator - */ - bool operator !=( - const Time& that) const; - - /** - * @param that Time to compare - * @return true if the Time is equal to the comparator - */ - bool operator ==( - const Time& that) const; - /** - * @param that Time to compare - * @return true if the Time is less than or equal to the comparator - */ - bool operator <=( - const Time& that) const; - /** - * @param that Time to compare - * @return true if the Time is less than the comparator - */ - bool operator <( - const Time& that) const; - - /** - * @param a_ti Duration to add - * @return Time value + Duration - */ - Time& operator +=( - const Duration& a_ti); - /** - * @param a_ti Duration to subtract - * @return Time value - Duration - */ - Time& operator -=( - const Duration& a_ti); - - /** - * Returns this Time in milliseconds. - * - * @return this Time in milliseconds - */ - int64_t to_millisecs() const; - - /** - * Returns this Time in micro-seconds. - * - * @return this Time in micro-seconds - */ - int64_t to_microsecs() const; - - /** - * Returns this Time in seconds. - * - * @return this Time in seconds - */ - double to_secs() const; - -private: - - int64_t sec_ = 0; - uint32_t nsec_ = 0; -}; - -// Time arithmetic operators. -/** - * Add a Duration to a Time value - * @param lhs Time - * @param rhs Duration - * @return Time * Duration - */ -const Time OMG_DDS_API operator +( - const Time& lhs, - const Duration& rhs); - -/** - * Add a Duration to a Time value - * @param lhs Duration - * @param rhs Time - * @return Duration + Time - */ -const Time OMG_DDS_API operator +( - const Duration& lhs, - const Time& rhs); - -/** - * Subtract a Duration from a Time value - * @param lhs Time - * @param rhs Duration - * @return Time - Duration - */ -const Time OMG_DDS_API operator -( - const Time& lhs, - const Duration& rhs); - -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_TIME_HPP_ diff --git a/include/dds/core/Value.hpp b/include/dds/core/Value.hpp deleted file mode 100644 index 30aa7e42892..00000000000 --- a/include/dds/core/Value.hpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_VALUE_HPP_ -#define OMG_DDS_CORE_VALUE_HPP_ - -namespace dds { -namespace core { - -/** - * @brief - * This class is the base for various value-type dds objects. - * - * QoS, Policy, Statuses, and Topic samples are all modeled as value-types. - * - * All objects that have a value-type have a deep-copy assignment and copy - * construction semantics. - * It should also be pointed out that value-types are not 'pure-value-types' in - * the sense that they are immutable (as in functional programming languages). - * - * The DDS-PSM-Cxx makes value-types mutable to limit the number of copies as well - * as to limit the time-overhead necessary to change a value-type - * (note that for immutable value-types the only form of change is to create a new - * value-type). - */ -template -class Value -{ -protected: - - Value(); - Value( - const Value& p); - -public: - - /** @cond - * The following Constructors are not really relevant for the API. - * So, leave them from the doxygen generated API documentation for clarity. - */ - - /** - * Create a value-type object of one internal value - * - * @param arg VALUETYPE value - */ - template - Value( - const ARG& arg); - - /** - * Create a value-type object of two internal value - * - * @param arg1 VALUETYPES value - * @param arg2 VALUETYPES value - */ - template< - typename ARG1, - typename ARG2> - Value( - const ARG1& arg1, - const ARG2& arg2); - - /** - * Create a value-type object of three internal value - * - * @param arg1 VALUETYPES value - * @param arg2 VALUETYPES value - * @param arg3 VALUETYPES value - */ - template< - typename ARG1, - typename ARG2, - typename ARG3> - Value( - const ARG1& arg1, - const ARG2& arg2, - const ARG3& arg3); - - /** - * Create a value-type object of four internal value - * - * @param arg1 VALUETYPES value - * @param arg2 VALUETYPES value - * @param arg3 VALUETYPES value - * @param arg4 VALUETYPES value - */ - template< - typename ARG1, - typename ARG2, - typename ARG3, - typename ARG4> - Value( - const ARG1& arg1, - const ARG2& arg2, - const ARG3& arg3, - const ARG4& arg4); - - /** - * Create a value-type object of five internal value - * - * @param arg1 VALUETYPES value - * @param arg2 VALUETYPES value - * @param arg3 VALUETYPES value - * @param arg4 VALUETYPES value - * @param arg5 VALUETYPES value - */ - template< - typename ARG1, - typename ARG2, - typename ARG3, - typename ARG4, - typename ARG5> - Value( - const ARG1& arg1, - const ARG2& arg2, - const ARG3& arg3, - const ARG4& arg4, - const ARG5& arg5); - - /** - * Create a value-type object of six internal value - * - * @param arg1 VALUETYPES value - * @param arg2 VALUETYPES value - * @param arg3 VALUETYPES value - * @param arg4 VALUETYPES value - * @param arg5 VALUETYPES value - * @param arg6 VALUETYPES value - */ - template< - typename ARG1, - typename ARG2, - typename ARG3, - typename ARG4, - typename ARG5, - typename ARG6> - Value( - const ARG1& arg1, - const ARG2& arg2, - const ARG3& arg3, - const ARG4& arg4, - const ARG5& arg5, - const ARG6& arg6); - /** @endcond */ - - /** @cond */ - ~Value(); - /** @endcond */ - - /** - * Assigns new delegate to this Value - * @param other Value - */ - Value& operator =( - const Value& other); - - /** - * Compare this Value with another Value - * - * @param other Value - * @return true if equal - */ - bool operator ==( - const Value& other) const; - - /** - * Compare this Value with another Value - * - * @param other Value - * @return true if not equal - */ - bool operator !=( - const Value& other) const; - - /** - * The operator->() is provided to be able to directly invoke - * functions on the delegate. - * - * The decision to provide direct access to - * the delegate was motivated by the need for providing a way that - * was not invasive with respect to the CXXDDS API and yet would allow - * for vendor-specific extension. - * Thus vendor-specific extensions can be invoked on the Value - * and on all its subclasses as follows: - * @code{.cpp} - * my_dds_value.standard_function(); - * my_dds_value->vendor_specific_extension(); - * @endcode - * - * @return a reference to delegate. - */ - D* operator ->(); - - /** @copydoc dds::core::Value::operator->() */ - const D* operator ->() const; - - /** @cond - * Functions possibly needed for delegate implementation, but not recommended - * for application usage: exclude from the API documentation for clarity. - * - * Returns an object to the underlying delegate. - */ - const D& delegate() const; - - D& delegate(); - - operator D& (); - - operator const D& () const; - /** @endcond */ - -protected: - - D d_; -}; - -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_VALUE_HPP_ diff --git a/include/dds/core/WeakReference.hpp b/include/dds/core/WeakReference.hpp deleted file mode 100644 index ffbc4c3e485..00000000000 --- a/include/dds/core/WeakReference.hpp +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_WEAK_REFERENCE_HPP_ -#define OMG_DDS_CORE_WEAK_REFERENCE_HPP_ - -#include - -namespace dds { -namespace core { - -/** - * @brief - * The WeakReference class enables you to maintain a weak - * reference to a DDS reference type. - * - * The existence of a weak link will not prevent the garbage - * collection of the reference type. - */ -template -class WeakReference -{ -public: - - typedef T ReferenceType; - -public: - - /** - * Creates a weak reference without an referenced dds object. - */ - WeakReference(); - - /** - * Creates a weak reference for the reference type passed as argument. - * - * @tparam t dds object the new weak reference will refer to - */ - WeakReference( - const T& t); - - /** @cond */ - ~WeakReference(); - /** @endcond */ - - /** - * Checks whether the underlying reference has been deleted. - * - * @returns true if the underlying reference has expired, false otherwise - */ - bool expired(); - - /** - * Gives access to the underlying shared reference. - * - * If the reference has expired the returned object will be referencing 'dds::core::null'. - * - * @return referenced dds object - */ - T lock(); - -private: - - typename T::DELEGATE_WEAK_REF_T impl_; -}; - -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_WEAK_REFERENCE_HPP_ diff --git a/include/dds/core/array.hpp b/include/dds/core/array.hpp deleted file mode 100644 index 96055173a54..00000000000 --- a/include/dds/core/array.hpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef ORG_OMG_DDS_CORE_ARRAY_HPP_ -#define ORG_OMG_DDS_CORE_ARRAY_HPP_ - -#include - -namespace dds { -namespace core { - -using dds::core::detail::array; - -} //namespace core -} //namespace dds - -#endif //ORG_OMG_DDS_CORE_ARRAY_HPP_ diff --git a/include/dds/core/cond/Condition.hpp b/include/dds/core/cond/Condition.hpp deleted file mode 100644 index 54466aff8c9..00000000000 --- a/include/dds/core/cond/Condition.hpp +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_COND_CONDITION_HPP_ -#define OMG_DDS_CORE_COND_CONDITION_HPP_ - -#include - -#include -#include -#include -//#include -//#include - -namespace dds { -namespace core { -namespace cond { - -/** - * @brief - * This class is the base class for all the conditions that may be attached to a dds::core::cond::WaitSet. - * - * This base class is specialized in three classes by the Data Distribution Service: - * - dds::core::cond::GuardCondition - * - dds::core::cond::StatusCondition - * - dds::sub::cond::ReadCondition - * - dds::sub::cond::QueryCondition - * - * Each Condition has a trigger_value that can be TRUE or FALSE and is set by - * the Data Distribution Service (except a GuardCondition) depending on the - * evaluation of the Condition. - * - * @see @ref DCPS_Modules_Infrastructure_Status "Status concept" - * @see @ref DCPS_Modules_Infrastructure_Waitset "WaitSet concept" - */ -template -class TCondition : public virtual Reference -{ -public: - - OMG_DDS_REF_TYPE_PROTECTED_DC( - TCondition, - dds::core::Reference, - DELEGATE) - - OMG_DDS_EXPLICIT_REF_BASE_DECL( - TCondition, - detail::StatusCondition) - - OMG_DDS_EXPLICIT_REF_BASE_DECL( - TCondition, - detail::GuardCondition) - - OMG_DDS_EXPLICIT_REF_BASE_DECL( - TCondition, - dds::sub::cond::detail::ReadCondition) - - OMG_DDS_EXPLICIT_REF_BASE_DECL( - TCondition, - dds::sub::cond::detail::QueryCondition) - - /** @cond */ - OMG_DDS_API ~TCondition(); - /** @endcond */ - - /** - * Registers a functor as custom handler with this Condition. - * - * The supplied functor will be called when this Condition is triggered - * and either the dds::core::cond::Condition::dispatch() is called or the - * dds::core::cond::WaitSet::dispatch() on the WaitSet to which this - * Condition is attached to. - * - * @tparam Functor The functor to be called when the StatusCondition triggers. - * @return void - * @throw dds::core::Exception - */ - template - OMG_DDS_API void handler( - Functor& func); - - /** @copydoc dds::core::cond::TCondition::handler(Functor& func) */ - template - OMG_DDS_API void handler( - const Functor& func); - - /** - * Resets the handler for this Condition. - * - * After the invocation of this function no handler will be registered with - * this Condition. - * - * @return void - * @throw dds::core::Exception - */ - OMG_DDS_API void reset_handler(); - - /** - * Dispatches the functor that have been registered with the Condition. - * - * The Condition has to have been triggered for the functor will be called - * by this function. - * - * @return void - * @throw dds::core::Exception - */ - OMG_DDS_API void dispatch(); - - /** - * This operation retrieves the trigger_value of the Condition. - * - * A Condition has a trigger_value that can be TRUE or FALSE and is set by the - * Data Distribution Service (except a GuardCondition). This operation returns the - * trigger_value of the Condition. - * - * @return bool The boolean value to which the Condition is set. - * @throw dds::core::Exception - */ - OMG_DDS_API bool trigger_value() const; - -}; - -typedef TCondition Condition; - -} //namespace cond -} //namespace core -} //namespace dds - -#include - -#endif //OMG_DDS_CORE_COND_CONDITION_HPP_ diff --git a/include/dds/core/cond/GuardCondition.hpp b/include/dds/core/cond/GuardCondition.hpp deleted file mode 100644 index e011040b64b..00000000000 --- a/include/dds/core/cond/GuardCondition.hpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_COND_GUARDCONDITION_HPP_ -#define OMG_DDS_CORE_COND_GUARDCONDITION_HPP_ - -#include -#include - -namespace dds { -namespace core { -namespace cond { - -/** - * @brief - * A GuardCondition object is a specific Condition whose trigger_value is - * completely under the control of the application. - * - * When a GuardCondition is initially created, the trigger_value is FALSE. - * - * The purpose of the GuardCondition is to provide the means for the - * application to manually triggering a WaitSet to stop waiting. This is accomplished by - * attaching the GuardCondition to the WaitSet and then setting the - * trigger_value by means of the set trigger_value operation. - * - * @code{.cpp} - * dds::core::cond::GuardCondition guard; - * dds::core::cond::WaitSet waitset; - * waitset.attach_condition(guard); - * waitset.wait(); - * ... - * // To wakeup waitset, do in another thread: - * guard.trigger_value(true); - * @endcode - * See the @ref anchor_dds_core_cond_waitset_examples "WaitSet examples" for more examples.
    - * Although the WaitSet examples use the StatusCondition, the basic usage of this Condition - * with a WaitSet is the same. - * - * @see dds::core::cond::Condition - * @see @ref DCPS_Modules_Infrastructure_Waitset "WaitSet concept" - * @see @ref anchor_dds_core_cond_waitset_examples "WaitSet examples" - */ -template -class TGuardCondition : public TCondition -{ -public: - - OMG_DDS_REF_TYPE_NO_DC( - TGuardCondition, - TCondition, - DELEGATE) - - OMG_DDS_EXPLICIT_REF_BASE( - TGuardCondition, - dds::core::cond::Condition) - /** - * Create a dds::core::cond::GuardCondition. - * - * The GuardCondition can then be added to a dds::core::cond::WaitSet so that the - * application can manually wake up a thread that is blocked on that WaitSet. - * - * @throw dds::core::Exception - */ - TGuardCondition(); - - /** - * Create a dds::core::cond::GuardCondition. - * - * The GuardCondition can then be added to a dds::core::cond::WaitSet so that the - * application can manually wake up a thread that is blocked on that WaitSet. - * - * The supplied functor will be called when this GuardCondition is triggered - * and either the inherited dds::core::cond::Condition::dispatch() is called or the - * dds::core::cond::WaitSet::dispatch() on the WaitSet to which this GuardCondition is - * attached to. - * - * @tparam functor The functor to be called when the GuardCondition triggers. - * @throw dds::core::Exception - */ - template - TGuardCondition( - FUN& functor); - - /** - * @copydoc dds::core::cond::TGuardCondition::TGuardCondition(FUN& functor) - */ - template - TGuardCondition( - const FUN& functor); - - /** @cond */ - ~TGuardCondition(); - /** @endcond */ - - /** - * This operation sets the trigger_value of the GuardCondition. - * - * A GuardCondition object is a specific Condition which trigger_value is - * completely under the control of the application. This operation must be used by the - * application to manually wake-up a WaitSet. This operation sets the - * trigger_value of the GuardCondition to the parameter value. The - * GuardCondition is directly created using the GuardCondition constructor. - * When a GuardCondition is initially created, the trigger_value is FALSE. - * - * @param value The boolean value to which the GuardCondition is set. - * @throw dds::core::Exception - */ - void trigger_value( - bool value); - - /** - * @copydoc dds::core::cond::TCondition::trigger_value() - */ - bool trigger_value(); -}; - -typedef dds::core::cond::detail::GuardCondition GuardCondition; - -} //namespace cond -} //namespace core -} //namespace dds - -#include - -#endif //OMG_DDS_CORE_COND_GUARDCONDITION_HPP_ diff --git a/include/dds/core/cond/StatusCondition.hpp b/include/dds/core/cond/StatusCondition.hpp deleted file mode 100644 index 83829721137..00000000000 --- a/include/dds/core/cond/StatusCondition.hpp +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_STATUSCONDITION_HPP_ -#define OMG_DDS_CORE_STATUSCONDITION_HPP_ - -#include -#include -#include - -namespace dds { -namespace core { -namespace cond { - -/** - * @brief - * A StatusCondition object is a specific Condition that is associated with each Entity. - * - * Entity objects that have status attributes also have a StatusCondition, access is - * provided to the application by the get_statuscondition operation. - * The communication statuses whose changes can be communicated to the application - * depend on the Entity. The following table shows the relevant statuses for each - * Entity. - * - * Entity | Status Name - * -------------------- | -------------------- - * dds::topic::Topic | dds::core::status::StatusMask::inconsistent_topic()
    dds::core::status::StatusMask::all_data_disposed_topic() - * dds::sub::Subscriber | dds::core::status::StatusMask::data_on_readers() - * dds::sub::DataReader | dds::core::status::StatusMask::sample_rejected()
    dds::core::status::StatusMask::liveliness_changed()
    dds::core::status::StatusMask::requested_deadline_missed()
    dds::core::status::StatusMask::requested_incompatible_qos()
    dds::core::status::StatusMask::data_available()
    dds::core::status::StatusMask::sample_lost()
    dds::core::status::StatusMask::subscription_matched() - * dds::pub::DataWriter | dds::core::status::StatusMask::liveliness_lost()
    dds::core::status::StatusMask::offered_deadline_missed()
    dds::core::status::StatusMask::offered_incompatible_qos()
    dds::core::status::StatusMask::publication_matched() - * - * The inherited dds::core::cond::Condition::trigger_value() of the StatusCondition - * depends on the communication statuses of that Entity (e.g., missed deadline) and - * also depends on the value of the dds::core::status::StatusMask. - * - * A StatusCondition can be attached to a WaitSet in order to allow an application - * to suspend until the trigger_value has become TRUE. - * - * The trigger_value of a StatusCondition will be TRUE if one of the enabled - * StatusChangedFlags is set. That is, trigger_value==FALSE only if all the - * values of the StatusChangedFlags are FALSE. - * - * The sensitivity of the StatusCondition to a particular communication status is - * controlled by the list of enabled_statuses set on the condition by means of - * dds::core::cond::StatusCondition::enabled_statuses(const ::dds::core::status::StatusMask& status) - * When the enabled_statuses are not changed by that - * operation, all statuses are enabled by default. - * - * See the @ref anchor_dds_core_cond_waitset_examples "WaitSet examples" for examples - * how to use this Condition. - * - * @see dds::core::cond::Condition - * @see @ref DCPS_Modules_Infrastructure_Status "Status concept" - * @see @ref DCPS_Modules_Infrastructure_Waitset "WaitSet concept" - * @see @ref anchor_dds_core_cond_waitset_examples "WaitSet examples" - */ -template -class TStatusCondition : public TCondition -{ -public: - - OMG_DDS_REF_TYPE_DELEGATE_C( - TStatusCondition, - TCondition, - DELEGATE) - - OMG_DDS_EXPLICIT_REF_BASE( - TStatusCondition, - dds::core::cond::Condition) - - /** - * Create a dds::core::cond::StatusCondition associated with an Entity. - * - * The StatusCondition can then be added to a dds::core::cond::WaitSet so that the - * application can wait for specific status changes that affect the Entity. - * - * @param e The Entity to associate with the StatusCondition. - * @throw dds::core::Exception - */ - TStatusCondition( - const dds::core::Entity& e); - - /** - * Create a dds::core::cond::StatusCondition associated with an Entity. - * - * The StatusCondition can then be added to a dds::core::cond::WaitSet so that the - * application can wait for specific status changes that affect the Entity. - * - * The supplied functor will be called when this StatusCondition is triggered - * and either the inherited dds::core::cond::Condition::dispatch() is called or the - * dds::core::cond::WaitSet::dispatch() on the WaitSet to which this StatusCondition is - * attached to. - * - * @param e The Entity to associate with the StatusCondition. - * @tparam functor The functor to be called when the StatusCondition triggers. - * @throw dds::core::Exception - */ - template - TStatusCondition( - const dds::core::Entity& e, - FUN& functor); - - /** @copydoc dds::core::cond::TStatusCondition::TStatusCondition(const dds::core::Entity& e, FUN& functor) */ - template - TStatusCondition( - const dds::core::Entity& e, - const FUN& functor); - - /** @cond */ - ~TStatusCondition(); - /** @endcond */ - - /** - * This operation sets the list of communication statuses that are taken into account to - * determine the trigger_value of the StatusCondition. - * - * The inherited dds::core::cond::Condition::trigger_value() of the StatusCondition - * depends on the communication status of that Entity (e.g., missed deadline, - * loss of information, etc.), ‘filtered’ by the set of enabled_statuses on the StatusCondition. - * - * This operation sets the list of communication statuses that are taken into account to - * determine the trigger_value of the StatusCondition. This operation may - * change the trigger_value of the StatusCondition. - * - * dds::core::cond::WaitSet objects behaviour depend on the changes of the trigger_value of - * their attached Conditions. Therefore, any WaitSet to which the StatusCondition - * is attached is potentially affected by this operation. - * If this function is not invoked, the default list of enabled_statuses includes all - * the statuses. - * - * The result value is a bit mask in which each bit shows which value has changed. The - * relevant bits represent one of the following statuses: - * - dds::core::status::StatusMask::inconsistent_topic() - * - dds::core::status::StatusMask::offered_deadline_missed() - * - dds::core::status::StatusMask::requested_deadline_missed() - * - dds::core::status::StatusMask::offered_incompatible_qos() - * - dds::core::status::StatusMask::requested_incompatible_qos() - * - dds::core::status::StatusMask::sample_lost() - * - dds::core::status::StatusMask::sample_rejected() - * - dds::core::status::StatusMask::data_on_readers() - * - dds::core::status::StatusMask::data_available() - * - dds::core::status::StatusMask::liveliness_lost() - * - dds::core::status::StatusMask::liveliness_changed() - * - dds::core::status::StatusMask::publication_matched() - * - dds::core::status::StatusMask::subscription_matched() - * - dds::core::status::StatusMask::all_data_disposed_topic() - * - * Each status bit is declared as a constant and can be used in an AND operation to - * check the status bit against the result of type StatusMask. Not all statuses are - * relevant to all Entity objects. See the respective Listener interfaces for each - * Entity for more information. - * - * @param status A bit mask in which each bit sets the status which is taken - * into account for the StatusCondition.the enabled statuses. - * @return void - * @throw dds::core::AlreadyClosedError - * @throw dds::core::Error - */ - void enabled_statuses( - const ::dds::core::status::StatusMask& status) const; - - /** - * This operation returns the list of enabled communication statuses of the - * StatusCondition. - * - * The inherited dds::core::cond::Condition::trigger_value() of the StatusCondition - * depends on the communication status of that Entity (e.g., missed deadline, - * loss of information, etc.), ‘filtered’ by the set of enabled_statuses on the StatusCondition. - * - * This operation returns the list of communication statuses that are taken into account - * to determine the trigger_value of the StatusCondition. This operation - * returns the statuses that were explicitly set on the last call to - * dds::core::cond::StatusCondition::enabled_statuses(const ::dds::core::status::StatusMask& status) const - * or, if enabled_statuses(status) was never called, the default list. - * - * The result value is a bit mask in which each bit shows which value has changed. The - * relevant bits represent one of the following statuses: - * - dds::core::status::StatusMask::inconsistent_topic() - * - dds::core::status::StatusMask::offered_deadline_missed() - * - dds::core::status::StatusMask::requested_deadline_missed() - * - dds::core::status::StatusMask::offered_incompatible_qos() - * - dds::core::status::StatusMask::requested_incompatible_qos() - * - dds::core::status::StatusMask::sample_lost() - * - dds::core::status::StatusMask::sample_rejected() - * - dds::core::status::StatusMask::data_on_readers() - * - dds::core::status::StatusMask::data_available() - * - dds::core::status::StatusMask::liveliness_lost() - * - dds::core::status::StatusMask::liveliness_changed() - * - dds::core::status::StatusMask::publication_matched() - * - dds::core::status::StatusMask::subscription_matched() - * - dds::core::status::StatusMask::all_data_disposed_topic() - * - * Each status bit is declared as a constant and can be used in an AND operation to - * check the status bit against the result of type StatusMask. Not all statuses are - * relevant to all Entity objects. See the respective Listener interfaces for each - * Entity for more information. - * - * @return dds::core::status::StatusMask - * A bit mask in which each bit shows which status is taken into - * account for the StatusCondition. - * @throw dds::core::Exception - */ - const ::dds::core::status::StatusMask enabled_statuses() const; - - /** - * This operation returns the Entity associated with the StatusCondition - * - * Note that there is exactly one Entity associated with each StatusCondition. - * - * @return dds::core::Entity The Entity associated with the StatusCondition. - * @throw dds::core::AlreadyClosedError - */ - const dds::core::Entity& entity() const; - -}; - -typedef detail::StatusCondition StatusCondition; - -} //namespace cond -} //namespace core -} //namespace dds - -#include - -#endif //OMG_DDS_CORE_STATUSCONDITION_HPP_ diff --git a/include/dds/core/cond/WaitSet.hpp b/include/dds/core/cond/WaitSet.hpp deleted file mode 100644 index 8550e0bb7da..00000000000 --- a/include/dds/core/cond/WaitSet.hpp +++ /dev/null @@ -1,427 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_WAITSET_HPP_ -#define OMG_DDS_CORE_WAITSET_HPP_ - -#include -#include -#include -#include - -namespace dds { -namespace core { -namespace cond { - -/** - * @brief - * A WaitSet object allows an application to wait until one or more of - * the attached Condition objects has a trigger_value of TRUE or else - * until the timeout expires. - * - * A WaitSet is not necessarily associated with a single DomainParticipant - * and could be used to wait for Condition objects associated with different - * DomainParticipant objects. - * - * @anchor anchor_dds_core_cond_waitset_examples - * Example with wait()
    - * When using the wait() operation, the triggered Conditions are returned in a list. - * @code{.cpp} - * // Create a Condition to attach to a Waitset - * dds::core::cond::StatusCondition readerSC = dds::core::cond::StatusCondition(reader); - * readerSC.enabled_statuses(dds::core::status::StatusMask::data_available()); - * - * // Create WaitSet and attach Condition - * dds::core::cond::WaitSet waitset; - * waitset.attach_condition(readerSC); // or waitset += readerSC; - * - * dds::core::cond::WaitSet::ConditionSeq conditions; - * while(true) { - * // Wait for any Condition to trigger. - * conditions = waitset.wait(); - * - * // Loop through the triggered conditions. - * for (int i=0; i < conditions.size(); i++) { - * // Handle data_available when right Condition triggered. - * if (conditions[i] == readerSC) { - * // Read samples from the DataReader - * } - * } - * } - * @endcode - - * Example with dispatch()
    - * When using the dispatch() operation, the Functors of the triggered Conditions - * will be called. - * @code{.cpp} - * // Functor to add to a Condition - * class FunctorStatusCondition { - * public: - * void operator()(const dds::core::cond::StatusCondition& condition) { - * // Possibly get reader from the condition and read some samples. - * } - * }; - * FunctorStatusCondition functor; - * - * // Create a Condition with functor to attach to a Waitset - * dds::core::cond::StatusCondition readerSC = dds::core::cond::StatusCondition(reader, functor); - * readerSC.enabled_statuses(dds::core::status::StatusMask::data_available()); - * - * // Create WaitSet and attach Condition - * dds::core::cond::WaitSet waitset; - * waitset.attach_condition(readerSC); // or waitset += readerSC; - * - * while(true) { - * // Wait for any Condition to trigger. - * // The functors of the Conditions are automatically called - * // when the Condition triggers. - * waitset.dispatch(); - * } - * @endcode - * - * @see @ref DCPS_Modules_Infrastructure_Waitset "WaitSet concept" - */ -template -class TWaitSet : public Reference -{ -public: - - typedef std::vector ConditionSeq; - -public: - - OMG_DDS_REF_TYPE_NO_DC( - TWaitSet, - Reference, - DELEGATE) - - OMG_DDS_IMPLICIT_REF_BASE( - TWaitSet) - - /** - * Create a WaitSet instance. - * - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - TWaitSet(); - - /** @cond */ - ~TWaitSet(); - /** @endcond */ - - /** - * This operation allows an application thread to wait for the occurrence - * of at least one of the conditions that is attached to the WaitSet. - * - * This operation allows an application thread to wait for the occurrence - * of certain Conditions. If none of the Conditions attached to the - * WaitSet have a trigger_value of TRUE, the wait operation will block - * suspending the calling thread. - * - * The wait operation takes a timeout argument that specifies the maximum - * duration for the wait. If this duration is exceeded and none of - * the attached Condition objects is true, a TimeoutError will be thrown. - * - * It is not allowed for more than one application thread to be waiting - * on the same WaitSet. If the wait operation is invoked on a WaitSet that - * already has a thread blocking on it, the operation will immediately - * raise a PreconditionNotMetError exception. - * - * The result of the wait operation is the list of all the attached - * Conditions that have a trigger_value of TRUE (i.e., the Conditions - * that unblocked the wait). - * - * @param timeout The maximum amount of time for which the wait - * should block while waiting for a Condition to be triggered. - * @return ConditionSeq - * A vector containing the triggered Conditions - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The WaitSet was not properly created and references to dds::core::null. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::TimeoutError - * The timeout has elapsed without any of the attached - * conditions becoming TRUE. - * @throws dds::core::PreconditionNotMetError - * When multiple thread try to invoke the function concurrently. - */ - const ConditionSeq wait( - const dds::core::Duration& timeout); - - /** - * This operation allows an application thread to wait for the occurrence - * of at least one of the conditions that is attached to the WaitSet. - * - * This operation allows an application thread to wait for the occurrence - * of certain Conditions. If none of the Conditions attached to the - * WaitSet have a trigger_value of TRUE, the wait operation will block - * suspending the calling thread. - * - * It is not allowed for more than one application thread to be waiting - * on the same WaitSet. If the wait operation is invoked on a WaitSet that - * already has a thread blocking on it, the operation will immediately - * raise a PreconditionNotMetError exception. - * - * The result of the wait operation is the list of all the attached - * Conditions that have a trigger_value of TRUE (i.e., the Conditions - * that unblocked the wait). - * - * @return ConditionSeq - * A vector containing the triggered Conditions - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The WaitSet was not properly created and references to dds::core::null. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::PreconditionNotMetError - * When multiple thread try to invoke the function concurrently. - */ - const ConditionSeq wait(); - - /** - * This operation allows an application thread to wait for the occurrence - * of at least one of the conditions that is attached to the WaitSet. - * - * This operation allows an application thread to wait for the occurrence - * of certain Conditions. If none of the Conditions attached to the - * WaitSet have a trigger_value of TRUE, the wait operation will block - * suspending the calling thread. - * - * The wait operation takes a timeout argument that specifies the maximum - * duration for the wait. If this duration is exceeded and none of - * the attached Condition objects is true, a TimeoutError will be thrown. - * - * It is not allowed for more than one application thread to be waiting - * on the same WaitSet. If the wait operation is invoked on a WaitSet that - * already has a thread blocking on it, the operation will immediately - * raise a PreconditionNotMetError exception. - * - * The result of the wait operation is the list of all the attached - * Conditions that have a trigger_value of TRUE (i.e., the Conditions - * that unblocked the wait). - * - * @param triggered A ConditionSeq in which to put Conditions that were - * triggered during the wait. - * @param timeout The maximum amount of time for which the wait should - * block while waiting for a Condition to be triggered. - * @return ConditionSeq - * A vector containing the triggered Conditions - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The WaitSet was not properly created and references to dds::core::null. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::TimeoutError - * The timeout has elapsed without any of the attached - * conditions becoming TRUE. - * @throws dds::core::PreconditionNotMetError - * When multiple thread try to invoke the function concurrently. - */ - ConditionSeq& wait( - ConditionSeq& triggered, - const dds::core::Duration& timeout); - - /** - * This operation allows an application thread to wait for the occurrence - * of at least one of the conditions that is attached to the WaitSet. - * - * This operation allows an application thread to wait for the occurrence - * of certain Conditions. If none of the Conditions attached to the - * WaitSet have a trigger_value of TRUE, the wait operation will block - * suspending the calling thread. - * - * It is not allowed for more than one application thread to be waiting - * on the same WaitSet. If the wait operation is invoked on a WaitSet that - * already has a thread blocking on it, the operation will immediately - * raise a PreconditionNotMetError exception. - * - * The result of the wait operation is the list of all the attached - * Conditions that have a trigger_value of TRUE (i.e., the Conditions - * that unblocked the wait). - * - * @param triggered A ConditionSeq in which to put Conditions that were - * triggered during the wait. - * @return ConditionSeq - * A vector containing the triggered Conditions - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The WaitSet was not properly created and references to dds::core::null. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::PreconditionNotMetError - * When multiple thread try to invoke the function concurrently. - */ - ConditionSeq& wait( - ConditionSeq& triggered); - - /** - * Waits for at least one of the attached Conditions to trigger and then - * dispatches the functor associated with the Condition. - * - * @return void - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The WaitSet was not properly created and references to dds::core::null. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::PreconditionNotMetError - * When multiple thread try to invoke the function concurrently. - */ - void dispatch(); - - /** - * Waits for at least one of the attached Conditions to trigger and then - * dispatches the functor associated with the Condition, or, times - * out and throws a TimeoutError. - * - * @param timeout The maximum amount of time for which the dispatch should - * block while waiting for a Condition to be triggered. - * @return void - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The WaitSet was not properly created and references to dds::core::null. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::TimeoutError - * The timeout has elapsed without any of the attached - * conditions becoming TRUE. - * @throws dds::core::PreconditionNotMetError - * When multiple thread try to invoke the function concurrently. - */ - void dispatch( - const dds::core::Duration& timeout); - - /** @copydoc dds::core::cond::TWaitSet::attach_condition(const dds::core::cond::Condition& cond) */ - TWaitSet& operator +=( - const Condition& cond); - - /** @copydoc dds::core::cond::TWaitSet::detach_condition(const dds::core::cond::Condition& cond) */ - TWaitSet& operator -=( - const Condition& cond); - - /** - * This operation attaches a Condition to the WaitSet. - * - * Attaches a Condition to the WaitSet. It is possible to attach a - * Condition on a WaitSet that is currently being waited upon - * (via the wait operation). In this case, if the Condition has a - * trigger_value of TRUE, then attaching the Condition will unblock - * the WaitSet. Adding a Condition that is already attached to the WaitSet - * has no effect. - * - * @param cond The Condition to be attached to this WaitSet. - * @return WaitSet The WaitSet itself so that attaching Conditions - * can be chained. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The WaitSet was not properly created and references to dds::core::null. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - TWaitSet& attach_condition( - const Condition& cond); - - /** - * This operation detaches a Condition to the WaitSet. - * - * Detaches a Condition from the WaitSet. If the Condition was not - * attached to the WaitSet, the operation will return false. - * - * @param cond The Condition to detach from this WaitSet - * @return bool True if the Condition was found and detached, False - * if the Condition was not part of the WaitSet. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The WaitSet was not properly created and references to dds::core::null. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - bool detach_condition( - const Condition& cond); - - /** - * This operation retrieves the list of attached Conditions. - * - * The resulting sequence will either be an empty sequence, meaning there were - * no conditions attached, or will contain a list of ReadCondition, - * QueryCondition, StatusCondition and GuardCondition. - * - * @return ConditionSeq - * The list of attached Conditions. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The WaitSet was not properly created and references to dds::core::null. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - const ConditionSeq conditions() const; - - /** - * This operation retrieves the list of attached Conditions. - * - * The resulting sequence will either be an empty sequence, meaning there were - * no conditions attached, or will contain a list of ReadCondition, - * QueryCondition, StatusCondition and GuardCondition. - * - * @param conds A ConditionSeq in which to put the attached Conditions. - * @return ConditionSeq - * The list of attached Conditions. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The WaitSet was not properly created and references to dds::core::null. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - ConditionSeq& conditions( - ConditionSeq& conds) const; -}; - -typedef dds::core::cond::detail::WaitSet WaitSet; - -} //namespace cond -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_DETAIL_WAITSET_HPP_ diff --git a/include/dds/core/cond/detail/Condition.hpp b/include/dds/core/cond/detail/Condition.hpp deleted file mode 100644 index 2762d81a5ab..00000000000 --- a/include/dds/core/cond/detail/Condition.hpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_COND_DETAIL_CONDITION_HPP_ -#define EPROSIMA_DDS_CORE_COND_DETAIL_CONDITION_HPP_ - -/** - * @cond - * Ignore this file in the API - */ - -//#include - -namespace dds { -namespace core { -namespace cond { -namespace detail { - -//using Condition = eprosima::fastdds::dds::Condition; -class Condition -{ -}; - -} //namespace detail -} //namespace cond -} //namespace core -} //namespace dds - -/** @endcond */ - -#endif //EPROISMA_DDS_CORE_COND_DETAIL_CONDITION_HPP_ diff --git a/include/dds/core/cond/detail/ConditionImpl.hpp b/include/dds/core/cond/detail/ConditionImpl.hpp deleted file mode 100644 index 42f2b1b4a98..00000000000 --- a/include/dds/core/cond/detail/ConditionImpl.hpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_COND_TCONDITION_IMPL_HPP_ -#define EPROSIMA_DDS_CORE_COND_TCONDITION_IMPL_HPP_ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include -#include - -namespace dds { -namespace core { -namespace cond { - -template -TCondition::~TCondition() -{ -} - -/** @cond - * Somehow, these cause functions duplicates in doxygen documentation. - */ -template -template -void TCondition::handler( - Functor& func) -{ - //To implement - // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); - // this->delegate()->set_handler(func); - -} - -template -template -void TCondition::handler( - const Functor& func) -{ - //To implement - // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); - // this->delegate()->set_handler(func); -} - -/** @endcond */ - -template -void TCondition::reset_handler() -{ - //To implement - // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); - // this->delegate()->reset_handler(); -} - -template -void TCondition::dispatch() -{ - //To implement - // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); - // this->delegate()->dispatch(); -} - -template -bool TCondition::trigger_value() const -{ - // return this->delegate()->get_trigger_value(); -} - -} //namespace cond -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_COND_TCONDITION_IMPL_HPP_ diff --git a/include/dds/core/cond/detail/GuardCondition.hpp b/include/dds/core/cond/detail/GuardCondition.hpp deleted file mode 100644 index c698f86fadc..00000000000 --- a/include/dds/core/cond/detail/GuardCondition.hpp +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_COND_DETAIL_GUARDCONDITION_HPP_ -#define EPROSIMA_DDS_CORE_COND_DETAIL_GUARDCONDITION_HPP_ - -/** - * @cond - * Ignore this file in the API - */ - -//#include - -namespace dds { -namespace core { -namespace cond { - -template -class TGuardCondition; - -namespace detail { - -//using GuardCondition = eprosima::fastdds::dds::GuardCondition; -class GuardCondition -{ -}; - -} //namespace detail -} //namespace cond -} //namespace core -} //namespace dds - - -/** @endcond */ - -#endif //EPROSIMA_DDS_CORE_COND_DETAIL_GUARDCONDITION_HPP_ diff --git a/include/dds/core/cond/detail/GuardConditionImpl.hpp b/include/dds/core/cond/detail/GuardConditionImpl.hpp deleted file mode 100644 index 4952d8a4095..00000000000 --- a/include/dds/core/cond/detail/GuardConditionImpl.hpp +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_COND_TGUARDCONDITION_IMPL_HPP_ -#define EPROSIMA_DDS_CORE_COND_TGUARDCONDITION_IMPL_HPP_ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include - -namespace dds { -namespace core { -namespace cond { - -template -TGuardCondition::TGuardCondition() -{ -} - -/** @cond - * Somehow, these cause functions duplicates in doxygen documentation. - */ -template -template -TGuardCondition::TGuardCondition( - FUN& functor) -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // this->set_ref(new DELEGATE); - // this->delegate()->init(this->impl_); - // this->delegate()->set_handler(functor); -} - -template -template -TGuardCondition::TGuardCondition( - const FUN& functor) -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // this->set_ref(new DELEGATE); - // this->delegate()->init(this->impl_); - // this->delegate()->set_handler(functor); -} - -/** @endcond */ - -template -TGuardCondition::~TGuardCondition() -{ -} - -template -void TGuardCondition::trigger_value( - bool /*value*/) -{ - // this->delegate()->set_trigger_value(value); -} - -template -bool TGuardCondition::trigger_value() -{ - return TCondition::trigger_value(); -} - -template -TCondition::TCondition( - /*const dds::core::cond::TGuardCondition& h*/) -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // if (h.is_nil()) { - // /* We got a null object and are not really able to do a typecheck here. */ - // /* So, just set a null object. */ - // *this = dds::core::null; - // } else { - // this->::dds::core::Reference::impl_ = OSPL_CXX11_STD_MODULE::dynamic_pointer_cast(h.delegate()); - // if (h.delegate() != this->::dds::core::Reference::impl_) { - // throw dds::core::IllegalOperationError(std::string("Attempted invalid cast: ") + typeid(h).name() + " to " + typeid(*this).name()); - // } - // } -} - -template -TCondition& TCondition::operator =( - /*const dds::core::cond::TGuardCondition& rhs*/) -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // if (this != (TCondition*)&rhs) { - // if (rhs.is_nil()) { - // /* We got a null object and are not really able to do a typecheck here. */ - // /* So, just set a null object. */ - // *this = dds::core::null; - // } else { - // TCondition other(rhs); - // /* Dont have to copy when the delegate is the same. */ - // if (other.delegate() != this->::dds::core::Reference::impl_) { - // *this = other; - // } - // } - // } - // return *this; -} - -} //namespace cond -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_COND_TGUARDCONDITION_IMPL_HPP_ diff --git a/include/dds/core/cond/detail/StatusCondition.hpp b/include/dds/core/cond/detail/StatusCondition.hpp deleted file mode 100644 index ef4fd1da47b..00000000000 --- a/include/dds/core/cond/detail/StatusCondition.hpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_COND_DETAIL_STATUSCONDITION_HPP_ -#define EPROSIMA_DDS_CORE_COND_DETAIL_STATUSCONDITION_HPP_ - -/** - * @cond - * Ignore this file in the API - */ - -//#include - -namespace dds { -namespace core { -namespace cond { - -template -class TStatusCondition; - -namespace detail { - -//using StatusCondition = eprosima::fastdds::dds::StatusCondition; -class StatusCondition -{ -}; - -} //namespace detail -} //namespace cond -} //namespace core -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_CORE_COND_DETAIL_STATUSCONDITION_HPP_ diff --git a/include/dds/core/cond/detail/StatusConditionImpl.hpp b/include/dds/core/cond/detail/StatusConditionImpl.hpp deleted file mode 100644 index 91824c86429..00000000000 --- a/include/dds/core/cond/detail/StatusConditionImpl.hpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_COND_TSTATUSCONDITION_IMPL_HPP_ -#define EPROSIMA_DDS_CORE_COND_TSTATUSCONDITION_IMPL_HPP_ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include - -namespace dds { -namespace core { -namespace cond { - -template -TStatusCondition::TStatusCondition( - const dds::core::Entity& /*e*/) -// : ::dds::core::cond::TCondition(new detail::StatusCondition(e)) -{ -} - -/** @cond - * Somehow, these cause functions duplicates in doxygen documentation. - */ -template -template -TStatusCondition::TStatusCondition( - const dds::core::Entity& /*e*/, - FUN& /*functor*/) -// : ::dds::core::cond::TCondition(new detail::StatusCondition(e, functor)) -{ -} - -template -template -TStatusCondition::TStatusCondition( - const dds::core::Entity& /*e*/, - const FUN& /*functor*/) -// : ::dds::core::cond::TCondition(new detail::StatusCondition(e, functor)) -{ -} - -/** @endcond */ - -template -TStatusCondition::~TStatusCondition() -{ -} - -template -void TStatusCondition::enabled_statuses( - const dds::core::status::StatusMask& /*status*/) const -{ - // this->delegate()->set_enabled_statuses(status); -} - -template -const dds::core::status::StatusMask TStatusCondition::enabled_statuses() const -{ - // return this->delegate()->get_enabled_statuses(); -} - -template -const dds::core::Entity& TStatusCondition::entity() const -{ - // return this->delegate()->get_entity(); -} - -template -TCondition::TCondition( - /*const TStatusCondition& h*/) -{ - //To implement - // if (h.is_nil()) { - // /* We got a null object and are not really able to do a typecheck here. */ - // /* So, just set a null object. */ - // *this = dds::core::null; - // } else { - // ISOCPP_REPORT_STACK_DDS_BEGIN(h); - - // this->::dds::core::Reference::impl_ = OSPL_CXX11_STD_MODULE::dynamic_pointer_cast(h.delegate()); - // if (h.delegate() != this->::dds::core::Reference::impl_) { - // throw dds::core::IllegalOperationError(std::string("Attempted invalid cast: ") + typeid(h).name() + " to " + typeid(*this).name()); - // } - // } -} - -template -TCondition& TCondition::operator =( - /*const dds::core::cond::TStatusCondition& rhs*/) -{ - //To implement - // if (this != (TCondition*)&rhs) { - // if (rhs.is_nil()) { - // /* We got a null object and are not really able to do a typecheck here. */ - // /* So, just set a null object. */ - // *this = dds::core::null; - // } else { - // TCondition other(rhs); - // /* Dont have to copy when the delegate is the same. */ - // if (other.delegate() != this->::dds::core::Reference::impl_) { - // *this = other; - // } - // } - // } - // return *this; -} - -} //namespace cond -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_COND_TSTATUSCONDITION_IMPL_HPP_ diff --git a/include/dds/core/cond/detail/WaitSet.hpp b/include/dds/core/cond/detail/WaitSet.hpp deleted file mode 100644 index 114341c6441..00000000000 --- a/include/dds/core/cond/detail/WaitSet.hpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_COND_DETAIL_WAITSET_HPP_ -#define EPROSIMA_DDS_CORE_COND_DETAIL_WAITSET_HPP_ - -/** - * @cond - * Ignore this file in the API - */ -//#include - -namespace dds { -namespace core { -namespace cond { -namespace detail { - -//using WaitSet = eprosima::fastdds::dds::WaitSet; -class WaitSet -{ -}; - -} //namespace detail -} //namespace cond -} //namespace core -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_CORE_COND_DETAIL_WAITSET_HPP_ diff --git a/include/dds/core/cond/detail/WaitSetImpl.hpp b/include/dds/core/cond/detail/WaitSetImpl.hpp deleted file mode 100644 index 59f26f34961..00000000000 --- a/include/dds/core/cond/detail/WaitSetImpl.hpp +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_COND_TWAITSET_HPP_ -#define EPROSIMA_DDS_CORE_COND_TWAITSET_HPP_ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include - -namespace dds { -namespace core { -namespace cond { - -template -TWaitSet::TWaitSet() -{ -} - -template -TWaitSet::~TWaitSet() -{ -} - -template -const typename TWaitSet::ConditionSeq TWaitSet::wait( - const dds::core::Duration& timeout) -{ - ConditionSeq triggered; - return this->wait(triggered, timeout); -} - -template -const typename TWaitSet::ConditionSeq TWaitSet::wait() -{ - ConditionSeq triggered; - return this->wait(triggered, dds::core::Duration::infinite()); -} - -template -typename TWaitSet::ConditionSeq& TWaitSet::wait( - ConditionSeq& /*triggered*/, - const dds::core::Duration& /*timeout*/) -{ - // this->delegate()->wait(triggered, timeout); - // return triggered; -} - -template -typename TWaitSet::ConditionSeq& TWaitSet::wait( - ConditionSeq & triggered) -{ - this->wait(triggered, dds::core::Duration::infinite()); - return triggered; -} - -template -void TWaitSet::dispatch() -{ - //To implement - // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); - // this->dispatch(dds::core::Duration::infinite()); -} - -template -void TWaitSet::dispatch( - const dds::core::Duration& timeout) -{ - //To implement - // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); - // this->delegate()->dispatch(timeout); -} - -template -TWaitSet& TWaitSet::operator +=( - const Condition& cond) -{ - this->attach_condition(cond); - return *this; -} - -template -TWaitSet& TWaitSet::operator -=( - const Condition& cond) -{ - this->detach_condition(cond); - return *this; -} - -template -TWaitSet& TWaitSet::attach_condition( - const Condition& /*cond*/) -{ - // this->delegate()->attach_condition(cond); - // return *this; -} - -template -bool TWaitSet::detach_condition( - const Condition& /*cond*/) -{ - // if (this->delegate()->detach_condition(cond.delegate().get()) == - // eprosima::fastrtps::types::ReturnCode_t::RETCODE_OK) - // { - // return true; - // } - // return false; -} - -template -const typename TWaitSet::ConditionSeq TWaitSet::conditions() const -{ - ConditionSeq conds; - return this->conditions(conds); -} - -template -typename TWaitSet::ConditionSeq& TWaitSet::conditions( - ConditionSeq& /*conds*/) const -{ - // this->delegate()->get_conditions(conds); - // return conds; -} - -} //namespace cond -} //namespace core -} //namespace dds - - -#endif //EPROSIMA_DDS_CORE_COND_TWAITSET_HPP_ diff --git a/include/dds/core/conformance.hpp b/include/dds/core/conformance.hpp deleted file mode 100644 index 5fa6404ff3a..00000000000 --- a/include/dds/core/conformance.hpp +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_CONFORMANCE_HPP_ -#define OMG_DDS_CORE_CONFORMANCE_HPP_ - -#include - -#endif //OMG_DDS_CORE_CONFORMANCE_HPP_ diff --git a/include/dds/core/ddscore.hpp b/include/dds/core/ddscore.hpp deleted file mode 100644 index e0e2ef93823..00000000000 --- a/include/dds/core/ddscore.hpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_PACKAGE_INCLUDE_HPP_ -#define OMG_DDS_CORE_PACKAGE_INCLUDE_HPP_ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -#endif //OMG_DDS_CORE_PACKAGE_INCLUDE_HPP_ \ No newline at end of file diff --git a/include/dds/core/detail/BuiltinTopicTypes.hpp b/include/dds/core/detail/BuiltinTopicTypes.hpp deleted file mode 100644 index f0ad0a0fa29..00000000000 --- a/include/dds/core/detail/BuiltinTopicTypes.hpp +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_DELEGATE_BUILTIN_TOPIC_TYPES_HPP_ -#define EPROSIMA_DDS_CORE_DELEGATE_BUILTIN_TOPIC_TYPES_HPP_ - -//#include -//TODO: Fix when BuiltinTopicDelegate and BuiltinTopic are implemented -//#include -//#include - -#if defined (OMG_DDS_X_TYPES_BUILTIN_TOPIC_TYPES_SUPPORT) - -namespace dds { -namespace core { -namespace detail { - -//TODO: Fix when BuiltinTopicDelegate and BuiltinTopic are implemented -//typedef dds::core::TBytesTopicType BytesTopicType; -class BytesTopicType -{ -}; - -//TODO: Fix when BuiltinTopicDelegate and BuiltinTopic are implemented -//typedef dds::core::TStringTopicType StringTopicType; -class StringTopicType -{ -}; - -//TODO: Fix when BuiltinTopicDelegate and BuiltinTopic are implemented -//typedef dds::core::TKeyedBytesTopicType KeyedBytesTopicType; -class KeyedBytesTopicType -{ -}; - -//TODO: Fix when BuiltinTopicDelegate and BuiltinTopic are implemented -//typedef dds::core::TKeyedStringTopicType KeyedStringTopicType; -class KeyedStringTopicType -{ -}; - -} //namespace detail - - -//============================================================================== -// Bytes Template -//============================================================================== - -template -TBytesTopicType::TBytesTopicType() - : Value( - std::vector()) -{ -} - -template -TBytesTopicType::TBytesTopicType( - const std::vector& data) - : dds::core::Value( - data) -{ -} - -template -TBytesTopicType::operator std::vector&() const -{ - return this->delegate().value(); -} - -template -const std::vector& TBytesTopicType::data() const -{ - return this->delegate().value(); -} - -template -void TBytesTopicType::data( - const std::vector& data) -{ - this->delegate().value(data); -} - -//============================================================================== -// String Template -//============================================================================== - -template -TStringTopicType::TStringTopicType() - : Value( - std::string()) -{ -} - -template -TStringTopicType::TStringTopicType( - const std::string& data) - : dds::core::Value( - data) -{ -} - -template -TStringTopicType::operator std::string& () const -{ - return this->delegate().value(); -} - -template -const std::string& TStringTopicType::data() const -{ - return this->delegate().value(); -} - -template -void TStringTopicType::data( - const std::string& data) -{ - this->delegate().value(data); -} - -//============================================================================== -// KeyedBytes Template -//============================================================================== - -template -TKeyedBytesTopicType::TKeyedBytesTopicType() - : Value( - std::string(), - std::vector()) -{ -} - -template -TKeyedBytesTopicType::TKeyedBytesTopicType( - const std::string& key, - const std::vector& value) - : Value( - key, - value) -{ -} - -template -const std::string& TKeyedBytesTopicType::key() const -{ - return this->delegate().key(); -} - -template -void TKeyedBytesTopicType::key( - const std::string& key) -{ - this->delegate().key(key); -} - -template -const std::vector& TKeyedBytesTopicType::value() const -{ - return this->delegate().value(); -} - -template -void TKeyedBytesTopicType::value( - const std::vector& value) -{ - this->delegate().value(value); -} - -//============================================================================== -// KeyedString Template -//============================================================================== - -template -TKeyedStringTopicType::TKeyedStringTopicType() - : Value( - std::string(), - std::string()) -{ -} - -template -TKeyedStringTopicType::TKeyedStringTopicType( - const std::string& key, - const std::string& value) - : Value( - key, - value) -{ -} - -template -const std::string& TKeyedStringTopicType::key() const -{ - return this->delegate().key(); -} - -template -void TKeyedStringTopicType::key( - const std::string& key) -{ - this->delegate().key(key); -} - -template -const std::string& TKeyedStringTopicType::value() const -{ - return this->delegate().value(); -} - -template -void TKeyedStringTopicType::value( - const std::string& value) -{ - this->delegate().value(value); -} - -} //namespace core -} //namespace dds - -#endif //OMG_DDS_X_TYPES_BUILTIN_TOPIC_TYPES_SUPPORT - -#endif //EPROSIMA_DDS_CORE_DELEGATE_BUILTIN_TOPIC_TYPES_HPP_ diff --git a/include/dds/core/detail/Entity.hpp b/include/dds/core/detail/Entity.hpp deleted file mode 100644 index 8f6a74ab48e..00000000000 --- a/include/dds/core/detail/Entity.hpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_DETAIL_ENTITY_IMPL_HPP_ -#define EPROSIMA_DDS_CORE_DETAIL_ENTITY_IMPL_HPP_ - -#include - -/** - * @cond - * Ignore this file in the API - */ - -namespace dds { -namespace core { -namespace detail { - -using Entity = eprosima::fastdds::dds::Entity; - -} //namespace detail -} //namespace core -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_CORE_DETAIL_ENTITY_IMPL_HPP_ diff --git a/include/dds/core/detail/EntityQosImpl.hpp b/include/dds/core/detail/EntityQosImpl.hpp deleted file mode 100644 index 9c3773001d4..00000000000 --- a/include/dds/core/detail/EntityQosImpl.hpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_TENTITYQOS_IMPL_HPP_ -#define EPROSIMA_DDS_CORE_TENTITYQOS_IMPL_HPP_ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include - -namespace dds { -namespace core { - -template -TEntityQos::TEntityQos() - : dds::core::Value() -{ -} - -template -TEntityQos::TEntityQos( - const TEntityQos& other) - : dds::core::Value(other.delegate()) -{ -} - -/** @cond - * Somehow, these cause functions duplicates in doxygen documentation. - */ -template -template -TEntityQos::TEntityQos( - const TEntityQos& qos) - : dds::core::Value(qos.delegate()) -{ -} - -/** @endcond */ - -template -TEntityQos::~TEntityQos() -{ -} - -/** @cond - * Somehow, these cause functions duplicates in doxygen documentation. - */ -template -template -TEntityQos& TEntityQos::policy( - const POLICY& p) -{ - //To implement - // this->dds::core::Value::delegate().policy(p); - // return *this; -} - -template -template -const POLICY& TEntityQos::policy() const -{ - //To implement - // return this->delegate().template policy(); -} - -template -template -POLICY& TEntityQos::policy() -{ - //To implement - // return this->delegate().template policy(); -} - -template -template -TEntityQos& TEntityQos::operator <<( - const POLICY& p) -{ - //To implement - // this->policy(p); - // return *this; -} - -template -template -const TEntityQos& TEntityQos::operator >>( - POLICY& p) const -{ - //To implement - // p = this->policy(); - // return *this; -} - -template -template -TEntityQos& TEntityQos::operator =( - const TEntityQos& other) -{ - //To implement - // if(this != (TEntityQos*)&other) - // { - // this->d_ = other.delegate(); - // } - // return *this; -} - -/** @endcond */ - -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_TENTITYQOS_IMPL_HPP_ diff --git a/include/dds/core/detail/InstanceHandle.hpp b/include/dds/core/detail/InstanceHandle.hpp deleted file mode 100644 index 62a14389a31..00000000000 --- a/include/dds/core/detail/InstanceHandle.hpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_DETAIL_INSTANCE_HANDLE_HPP_ -#define EPROSIMA_DDS_CORE_DETAIL_INSTANCE_HANDLE_HPP_ - -#include - -/** - * @cond - * Ignore this file in the API - */ - -namespace dds { -namespace core { -namespace detail { - -using InstanceHandle = eprosima::fastdds::dds::InstanceHandle_t; - -} //namespace detail -} //namespace core -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_CORE_DETAIL_INSTANCE_HANDLE_HPP_ diff --git a/include/dds/core/detail/QosProvider.hpp b/include/dds/core/detail/QosProvider.hpp deleted file mode 100644 index 62eb2529a5b..00000000000 --- a/include/dds/core/detail/QosProvider.hpp +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_DETAIL_QOS_PROVIDER_HPP_ -#define EPROSIMA_DDS_CORE_DETAIL_QOS_PROVIDER_HPP_ - -//#include - -/** - * @cond - * Ignore this file in the API - */ - -namespace dds { -namespace core { -namespace detail { - -//TODO: Fix when QosProviderDelegate is implemented -class QosProvider -{ -}; - -} //namespace detail -} //namespace core -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_CORE_DETAIL_QOS_PROVIDER_HPP_ diff --git a/include/dds/core/detail/QosProviderImpl.hpp b/include/dds/core/detail/QosProviderImpl.hpp deleted file mode 100644 index ee015cde06e..00000000000 --- a/include/dds/core/detail/QosProviderImpl.hpp +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_DETAIL_TQOSPROVIDERIMPL_HPP_ -#define EPROSIMA_DDS_CORE_DETAIL_TQOSPROVIDERIMPL_HPP_ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include - -namespace dds { -namespace core { - -template -TQosProvider::TQosProvider( - const std::string& uri, - const std::string& profile) - : Reference(new DELEGATE(uri, profile)) -{ -} - -template -TQosProvider::TQosProvider( - const std::string& uri) - : Reference(new DELEGATE(uri)) -{ -} - -template -dds::domain::qos::DomainParticipantQos TQosProvider::participant_qos() -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // return this->delegate()->participant_qos(NULL); -} - -template -dds::domain::qos::DomainParticipantQos TQosProvider::participant_qos( - const std::string& id) -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // return this->delegate()->participant_qos(id.c_str()); -} - -template -dds::topic::qos::TopicQos TQosProvider::topic_qos() -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // return this->delegate()->topic_qos(NULL); -} - -template -dds::topic::qos::TopicQos TQosProvider::topic_qos( - const std::string& id) -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // return this->delegate()->topic_qos(id.c_str()); -} - -template -dds::sub::qos::SubscriberQos TQosProvider::subscriber_qos() -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // return this->delegate()->subscriber_qos(NULL); -} - -template -dds::sub::qos::SubscriberQos TQosProvider::subscriber_qos( - const std::string& id) -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // return this->delegate()->subscriber_qos(id.c_str()); -} - -template -dds::sub::qos::DataReaderQos TQosProvider::datareader_qos() -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // return this->delegate()->datareader_qos(NULL); -} - -template -dds::sub::qos::DataReaderQos TQosProvider::datareader_qos( - const std::string& id) -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // return this->delegate()->datareader_qos(id.c_str()); -} - -template -dds::pub::qos::PublisherQos TQosProvider::publisher_qos() -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // return this->delegate()->publisher_qos(NULL); -} - -template -dds::pub::qos::PublisherQos TQosProvider::publisher_qos( - const std::string& id) -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // return this->delegate()->publisher_qos(id.c_str()); -} - -template -dds::pub::qos::DataWriterQos TQosProvider::datawriter_qos() -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // return this->delegate()->datawriter_qos(NULL); -} - -template -dds::pub::qos::DataWriterQos TQosProvider::datawriter_qos( - const std::string& id) -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // return this->delegate()->datawriter_qos(id.c_str()); -} - -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_DETAIL_TQOSPROVIDERIMPL_HPP_ diff --git a/include/dds/core/detail/ReferenceImpl.hpp b/include/dds/core/detail/ReferenceImpl.hpp deleted file mode 100644 index 05f20625264..00000000000 --- a/include/dds/core/detail/ReferenceImpl.hpp +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_REFERENCE_IMPL_HPP_ -#define EPROSIMA_DDS_CORE_REFERENCE_IMPL_HPP_ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include - -namespace dds { -namespace core { - -// Implementation -template -Reference::Reference( - null_type&) - : impl_() -{ -} - -template -Reference::Reference( - const Reference& ref) - : impl_(ref.impl_) -{ -} - -template -template -Reference::Reference( - const Reference& ref) -{ - //To Implement - // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); - // impl_ = OSPL_CXX11_STD_MODULE::dynamic_pointer_cast(ref.impl_); - // if (impl_ != ref.impl_) { - // throw dds::core::IllegalOperationError(std::string("Attempted invalid cast: ") + typeid(ref).name() + " to " + typeid(*this).name()); - // } - -} - -template -Reference::Reference( - DELEGATE_T* p) - : impl_(p) -{ -} - -template -Reference::Reference( - const DELEGATE_REF_T& p) - : impl_(p) -{ - //OMG_DDS_LOG("MM", "Reference(DELEGATE_REF_T& p)"); -} - -template -Reference::~Reference() -{ -} - -template -Reference::operator DELEGATE_REF_T() const -{ - //To implement - // ISOCPP_REPORT_STACK_NC_BEGIN(); - // ISOCPP_BOOL_CHECK_AND_THROW(impl_, ISOCPP_NULL_REFERENCE_ERROR, "Reference[%d] == dds::core::null", __LINE__); - // return impl_; -} - -template -template -bool Reference::operator ==( - const R& ref) const -{ - //To implement - // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); - // bool equal = false; - // if (this->is_nil() && ref.is_nil()) { - // /* Both delegates are null. */ - // equal = true; - // } else if (!this->is_nil() && !ref.is_nil()) { - // /* Check delegates. */ - // equal = (this->delegate() == ref.delegate()); - // } - // return equal; -} - -template -template -bool Reference::operator !=( - const R& ref) const -{ - //To implement - // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); - // return !(*this == ref); -} - -template -template -Reference& Reference::operator =( - const Reference& that) -{ - //To implement - // OMG_DDS_STATIC_ASSERT((dds::core::is_base_of::value)); - // if(this != (Reference*)&that) - // { - // *this = Reference(that); - // } - // return *this; -} - -template -template -Reference& Reference::operator =( - const R& rhs) -{ - //To implement - // OMG_DDS_STATIC_ASSERT((dds::core::is_base_of< DELEGATE_T, typename R::DELEGATE_T>::value)); - // if(this != (Reference*)&rhs) - // { - // *this = Reference(rhs); - // } - // return *this; -} - -template -Reference& Reference::operator =( - const null_type) -{ - //To implement - // DELEGATE_REF_T tmp; - // impl_ = tmp; - // return *this; -} - -template -bool Reference::is_nil() const -{ - //To implement - // return impl_.get() == 0; -} - -template -bool Reference::operator ==( - const null_type) const -{ - //To implement - // return this->is_nil(); -} - -template -bool Reference::operator !=( - const null_type) const -{ - //To implement - // return !(this->is_nil()); -} - -template -const typename Reference::DELEGATE_REF_T& Reference::delegate() const -{ - //To implement - // ISOCPP_BOOL_CHECK_AND_THROW(impl_, ISOCPP_NULL_REFERENCE_ERROR, "Reference[%d] == dds::core::null", __LINE__); - // return impl_; -} - -template -typename Reference::DELEGATE_REF_T& Reference::delegate() -{ - //To implement - // ISOCPP_BOOL_CHECK_AND_THROW(impl_, ISOCPP_NULL_REFERENCE_ERROR, "Reference[%d] == dds::core::null", __LINE__); - // return impl_; -} - -template -DELEGATE* Reference::operator ->() -{ - //To implement - // ISOCPP_BOOL_CHECK_AND_THROW(impl_, ISOCPP_NULL_REFERENCE_ERROR, "Reference[%d] == dds::core::null", __LINE__); - // return impl_.get(); -} - -template -const DELEGATE* Reference::operator ->() const -{ - //To implement - // ISOCPP_BOOL_CHECK_AND_THROW(impl_, ISOCPP_NULL_REFERENCE_ERROR, "Reference[%d] == dds::core::null", __LINE__); - // return impl_.get(); -} - -template -Reference::operator const typename Reference::DELEGATE_REF_T& () const -{ - //To implement - // ISOCPP_BOOL_CHECK_AND_THROW(impl_, ISOCPP_NULL_REFERENCE_ERROR, "Reference[%d] == dds::core::null", __LINE__); - // return impl_; -} - -template -Reference::operator typename Reference::DELEGATE_REF_T& () -{ - //To implement - // ISOCPP_BOOL_CHECK_AND_THROW(impl_, ISOCPP_NULL_REFERENCE_ERROR, "Reference[%d] == dds::core::null", __LINE__); - // return impl_; -} - -template -void Reference::set_ref( - DELEGATE_T* p) -{ - //To implement - // impl_.reset(p); -} - -template -bool operator ==( - null_type, - const Reference& r) -{ - //To implement - // return r.is_nil(); -} - -template -bool operator !=( - null_type, - const Reference& r) -{ - //To implement - // return !r.is_nil(); -} - -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_REFERENCE_IMPL_HPP_ diff --git a/include/dds/core/detail/Value.hpp b/include/dds/core/detail/Value.hpp deleted file mode 100644 index 4da652d4851..00000000000 --- a/include/dds/core/detail/Value.hpp +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_DETAIL_VALUE_HPP_ -#define EPROSIMA_DDS_CORE_DETAIL_VALUE_HPP_ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include - -namespace dds { -namespace core { - -/** - * @internal @todo We can't assume that the compiler supports variadic templates, yet. - * This code should be refactored to take advantage of compilers that do support variadic - * templates. - */ - -template -Value::Value() -{ -} - -template -Value::Value( - const Value& p) - : d_(p.d_) -{ -} - -template -template -Value::Value( - const ARG& arg) - : d_(arg) -{ -} - -template -template< - typename ARG1, - typename ARG2> -Value::Value( - const ARG1& arg1, - const ARG2& arg2) - : d_(arg1, arg2) -{ -} - -template -template< - typename ARG1, - typename ARG2, - typename ARG3> -Value::Value( - const ARG1& arg1, - const ARG2& arg2, - const ARG3& arg3) - : d_(arg1, arg2, arg3) -{ -} - -template -template< - typename ARG1, - typename ARG2, - typename ARG3, - typename ARG4> -Value::Value( - const ARG1& arg1, - const ARG2& arg2, - const ARG3& arg3, - const ARG4& arg4) - : d_(arg1, arg2, arg3, arg4) -{ -} - -template -template< - typename ARG1, - typename ARG2, - typename ARG3, - typename ARG4, - typename ARG5> -Value::Value( - const ARG1& arg1, - const ARG2& arg2, - const ARG3& arg3, - const ARG4& arg4, - const ARG5& arg5) - : d_(arg1, arg2, arg3, arg4, arg5) -{ -} - -template -template< - typename ARG1, - typename ARG2, - typename ARG3, - typename ARG4, - typename ARG5, - typename ARG6> -Value::Value( - const ARG1& arg1, - const ARG2& arg2, - const ARG3& arg3, - const ARG4& arg4, - const ARG5& arg5, - const ARG6& arg6) - : d_(arg1, arg2, arg3, arg4, arg5, arg6) -{ -} - -template -Value::~Value() -{ -} - -template -Value& Value::operator =( - const Value& other) -{ - if (this != &other) - { - d_ = other.d_; - } - return *this; -} - -template -bool Value::operator ==( - const Value& other) const -{ - return (d_ == other.d_); -} - -template -bool Value::operator !=( - const Value& other) const -{ - return !(d_ == other.d_); -} - -template -const D* Value::operator ->() const -{ - return &d_; -} - -template -D* Value::operator ->() -{ - return &d_; -} - -template -const D& Value::delegate() const -{ - return d_; -} - -template -D& Value::delegate() -{ - return d_; -} - -template -Value::operator D& () -{ - return d_; -} - -template -Value::operator const D& () const -{ - return d_; -} - -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_DETAIL_VALUE_HPP_ diff --git a/include/dds/core/detail/WeakReferenceImpl.hpp b/include/dds/core/detail/WeakReferenceImpl.hpp deleted file mode 100644 index 63d79b61833..00000000000 --- a/include/dds/core/detail/WeakReferenceImpl.hpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_WEAK_REFERENCE_IMPL_HPP_ -#define EPROSIMA_DDS_CORE_WEAK_REFERENCE_IMPL_HPP_ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include -#include - -namespace dds { -namespace core { - -template -WeakReference::WeakReference() -{ -} - -template -WeakReference::WeakReference( - const T& t) -{ - //To implement - // if (!t.is_nil()) { - // impl_ = t.delegate(); - // } -} - -template -WeakReference::~WeakReference() -{ -} - -template -bool WeakReference::expired() -{ - //To implement - // return impl_.expired(); -} - -template -T WeakReference::lock() -{ - //To implement - // return T(impl_.lock()); -} - -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_WEAK_REFERENCE_IMPL_HPP_ diff --git a/include/dds/core/detail/array.hpp b/include/dds/core/detail/array.hpp deleted file mode 100644 index 285d53960ae..00000000000 --- a/include/dds/core/detail/array.hpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_DETAIL_ARRAY_HPP_ -#define EPROSIMA_DDS_CORE_DETAIL_ARRAY_HPP_ - -#include - -namespace dds { -namespace core { -namespace detail { - -using ::std::array; - -} //namespace detail -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_DETAIL_ARRAY_HPP_ - diff --git a/include/dds/core/detail/conformance.hpp b/include/dds/core/detail/conformance.hpp deleted file mode 100644 index f33f7d997e6..00000000000 --- a/include/dds/core/detail/conformance.hpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_DETAIL_CONFORMANCE_HPP_ -#define EPROSIMA_DDS_CORE_DETAIL_CONFORMANCE_HPP_ - -/* The following macros correspond to the compliance "profiles" of the DDS - * specification. Implementations shall modify this header to indicate their - * level of support: - * - An implementation fully implementing a given profile shall define - * the corresponding macro to "FULL". - * - An implementation partially supporting a given profile shall define - * the corresponding macro to "PARTIAL". - * - And implementation with no support for a given profile shall leave - * the corresponding macro undefined. - * - * DDS Minimum Profile support is required of all DDS implementations; - * therefore no corresponding macro is provided. - */ - -//#define OMG_DDS_CONTENT_SUBSCRIPTION_SUPPORT FULL -//#define OMG_DDS_MULTI_TOPIC_SUPPORT FULL -#define OMG_DDS_PERSISTENCE_SUPPORT FULL -#define OMG_DDS_OWNERSHIP_SUPPORT PARTIAL -#define OMG_DDS_OBJECT_MODEL_SUPPORT PARTIAL -#define OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT PARTIAL -#define OMG_DDS_X_TYPES_DYNAMIC_TYPE_SUPPORT FULL -//#define OMG_DDS_HAS_PRETTY_PRINT_COUT 1 - -#endif //EPROSIMA_DDS_CORE_DETAIL_CONFORMANCE_HPP_ diff --git a/include/dds/core/detail/dds_builtinTopics.h b/include/dds/core/detail/dds_builtinTopics.h deleted file mode 100644 index 36acc130aca..00000000000 --- a/include/dds/core/detail/dds_builtinTopics.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_BUILTINTOPICS_H_ -#define EPROSIMA_DDS_BUILTINTOPICS_H_ - -#include -#include -//TODO: Fix when DataRepresentation and TypeHash are implemented -//#include -//#include - -namespace DDS { - -typedef dds::core::ByteSeq octSeq; - -typedef dds::topic::BuiltinTopicKey BuiltinTopicKey_t; -typedef dds::core::StringSeq StringSeq; - -//TODO: Fix when DataRepresentation and TypeHash are implemented -// using org::opensplice::topic::DataRepresentationId_t; -// using org::opensplice::topic::XCDR_REPRESENTATION; -// using org::opensplice::topic::XML_REPRESENTATION; -// using org::opensplice::topic::OSPL_REPRESENTATION; -// using org::opensplice::topic::GPB_REPRESENTATION; -// using org::opensplice::topic::INVALID_REPRESENTATION; - -typedef dds::core::Duration Duration_t; - -typedef dds::core::policy::UserData UserDataQosPolicy; -typedef dds::core::policy::TopicData TopicDataQosPolicy; -typedef dds::core::policy::GroupData GroupDataQosPolicy; -typedef dds::core::policy::TransportPriority TransportPriorityQosPolicy; -typedef dds::core::policy::Lifespan LifespanQosPolicy; -typedef dds::core::policy::DurabilityKind DurabilityQosPolicyKind; -typedef dds::core::policy::Durability DurabilityQosPolicy; -typedef dds::core::policy::PresentationAccessScopeKind PresentationQosPolicyAccessScopeKind; -typedef dds::core::policy::Presentation PresentationQosPolicy; -typedef dds::core::policy::Deadline DeadlineQosPolicy; -typedef dds::core::policy::LatencyBudget LatencyBudgetQosPolicy; -typedef dds::core::policy::OwnershipKind OwnershipQosPolicyKind; -typedef dds::core::policy::Ownership OwnershipQosPolicy; -#ifdef OMG_DDS_OWNERSHIP_SUPPORT -typedef dds::core::policy::OwnershipStrength OwnershipStrengthQosPolicy; -#endif //OMG_DDS_OWNERSHIP_SUPPORT -typedef dds::core::policy::LivelinessKind LivelinessQosPolicyKind; -typedef dds::core::policy::Liveliness LivelinessQosPolicy; -typedef dds::core::policy::TimeBasedFilter TimeBasedFilterQosPolicy; -typedef dds::core::policy::Partition PartitionQosPolicy; -typedef dds::core::policy::ReliabilityKind ReliabilityQosPolicyKind; -typedef dds::core::policy::Reliability ReliabilityQosPolicy; -typedef dds::core::policy::DestinationOrderKind DestinationOrderQosPolicyKind; -typedef dds::core::policy::DestinationOrder DestinationOrderQosPolicy; -typedef dds::core::policy::HistoryKind HistoryQosPolicyKind; -typedef dds::core::policy::History HistoryQosPolicy; -typedef dds::core::policy::ResourceLimits ResourceLimitsQosPolicy; -#ifdef OMG_DDS_PERSISTENCE_SUPPORT -typedef dds::core::policy::DurabilityService DurabilityServiceQosPolicy; -#endif //OMG_DDS_PERSISTENCE_SUPPORT -//TODO: Fix when DataRepresentation and TypeHash are implemented -// typedef org::opensplice::core::policy::ProductData ProductDataQosPolicy; -typedef dds::core::policy::EntityFactory EntityFactoryQosPolicy; -// typedef org::opensplice::core::policy::Share ShareQosPolicy; -typedef dds::core::policy::WriterDataLifecycle WriterDataLifecycleQosPolicy; -// typedef org::opensplice::core::policy::InvalidSampleVisibility InvalidSampleVisibilityQosPolicyKind; -// typedef org::opensplice::core::policy::SubscriptionKey SubscriptionKeyQosPolicy; -typedef dds::core::policy::ReaderDataLifecycle ReaderDataLifecycleQosPolicy; -// typedef org::opensplice::core::policy::SubscriptionKey UserKeyQosPolicy; -// typedef org::opensplice::core::policy::ReaderLifespan ReaderLifespanQosPolicy; -// typedef org::opensplice::topic::TypeHash TypeHash; -typedef dds::topic::ParticipantBuiltinTopicData ParticipantBuiltinTopicData; -typedef dds::topic::TopicBuiltinTopicData TopicBuiltinTopicData; -// typedef org::opensplice::topic::TypeBuiltinTopicData TypeBuiltinTopicData; -typedef dds::topic::PublicationBuiltinTopicData PublicationBuiltinTopicData; -typedef dds::topic::SubscriptionBuiltinTopicData SubscriptionBuiltinTopicData; -// typedef org::opensplice::topic::CMParticipantBuiltinTopicData CMParticipantBuiltinTopicData; -// typedef org::opensplice::topic::CMPublisherBuiltinTopicData CMPublisherBuiltinTopicData; -// typedef org::opensplice::topic::CMSubscriberBuiltinTopicData CMSubscriberBuiltinTopicData; -// typedef org::opensplice::topic::CMDataWriterBuiltinTopicData CMDataWriterBuiltinTopicData; -// typedef org::opensplice::topic::CMDataReaderBuiltinTopicData CMDataReaderBuiltinTopicData; - -} //namespace DDS - -#endif //EPROSIMA_DDS_BUILTINTOPICS_H_ diff --git a/include/dds/core/detail/dds_builtinTopicsSplDcps.h b/include/dds/core/detail/dds_builtinTopicsSplDcps.h deleted file mode 100644 index 34f0ef970ca..00000000000 --- a/include/dds/core/detail/dds_builtinTopicsSplDcps.h +++ /dev/null @@ -1,577 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_BUILTINTOPICSSPLTYPES_H_ -#define EPROSIMA_DDS_BUILTINTOPICSSPLTYPES_H_ - -//#include -//#include -//#include -//#include -//#include -#include -#include -//#include -//#include "v_copyIn.h" - -//typedef os_uchar *_DDS_octSeq; -//v_copyin_result -//__DDS_octSeq__copyIn( -// c_type dbType, -// const dds::core::ByteSeq *from, -// _DDS_octSeq *to); - - -//typedef c_long _DDS_BuiltinTopicKey_t[3]; -//v_copyin_result -//__DDS_BuiltinTopicKey_t__copyIn( -// c_type dbType, -// const dds::topic::BuiltinTopicKey *from, -// _DDS_BuiltinTopicKey_t *to); - -//typedef c_sequence _DDS_StringSeq; -//v_copyin_result -//__DDS_StringSeq__copyIn( -// c_type dbType, -// const dds::core::StringSeq *from, -// _DDS_StringSeq *to); - -//typedef c_short _DDS_DataRepresentationId_t; - -struct _DDS_Duration_t; -//OMG_DDS_API v_copyin_result __DDS_Duration_t__copyIn(c_type dbType, const struct dds::core::Duration *from, struct _DDS_Duration_t *to); -OMG_DDS_API void __DDS_Duration_t__copyOut( - const void* _from, - void* _to); -//struct _DDS_Duration_t { -// c_long sec; -// c_ulong nanosec; -//}; - - -struct _DDS_UserDataQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_UserDataQosPolicy__copyIn(c_type dbType, const dds::core::policy::UserData *from, struct _DDS_UserDataQosPolicy *to); -OMG_DDS_API void __DDS_UserDataQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_UserDataQosPolicy { -// _DDS_octSeq value; -//}; - -struct _DDS_TopicDataQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_TopicDataQosPolicy__copyIn(c_type dbType, const dds::core::policy::TopicData *from, struct _DDS_TopicDataQosPolicy *to); -OMG_DDS_API void __DDS_TopicDataQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_TopicDataQosPolicy { -// _DDS_octSeq value; -//}; - -struct _DDS_GroupDataQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_GroupDataQosPolicy__copyIn(c_type dbType, const dds::core::policy::GroupData *from, struct _DDS_GroupDataQosPolicy *to); -OMG_DDS_API void __DDS_GroupDataQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_GroupDataQosPolicy { -// _DDS_octSeq value; -//}; - -struct _DDS_TransportPriorityQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_TransportPriorityQosPolicy__copyIn(c_type dbType, const dds::core::policy::TransportPriority *from, struct _DDS_TransportPriorityQosPolicy *to); -OMG_DDS_API void __DDS_TransportPriorityQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_TransportPriorityQosPolicy { -// c_long value; -//}; - -struct _DDS_LifespanQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_LifespanQosPolicy__copyIn(c_type dbType, const dds::core::policy::Lifespan *from, struct _DDS_LifespanQosPolicy *to); -OMG_DDS_API void __DDS_LifespanQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_LifespanQosPolicy { -// struct _DDS_Duration_t duration; -//}; - -enum _DDS_DurabilityQosPolicyKind -{ - _DDS_VOLATILE_DURABILITY_QOS, - _DDS_TRANSIENT_LOCAL_DURABILITY_QOS, - _DDS_TRANSIENT_DURABILITY_QOS, - _DDS_PERSISTENT_DURABILITY_QOS -}; -struct _DDS_DurabilityQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_DurabilityQosPolicy__copyIn(c_type dbType, const dds::core::policy::Durability *from, struct _DDS_DurabilityQosPolicy *to); -OMG_DDS_API void __DDS_DurabilityQosPolicy__copyOut( - const void* _from, - void* _to); -struct _DDS_DurabilityQosPolicy -{ - enum _DDS_DurabilityQosPolicyKind kind; -}; - -enum _DDS_PresentationQosPolicyAccessScopeKind -{ - _DDS_INSTANCE_PRESENTATION_QOS, - _DDS_TOPIC_PRESENTATION_QOS, - _DDS_GROUP_PRESENTATION_QOS -}; -struct _DDS_PresentationQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_PresentationQosPolicy__copyIn(c_type dbType, const dds::core::policy::Presentation *from, struct _DDS_PresentationQosPolicy *to); -OMG_DDS_API void __DDS_PresentationQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_PresentationQosPolicy { -// enum _DDS_PresentationQosPolicyAccessScopeKind access_scope; -// c_bool coherent_access; -// c_bool ordered_access; -//}; - -struct _DDS_DeadlineQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_DeadlineQosPolicy__copyIn(c_type dbType, const dds::core::policy::Deadline *from, struct _DDS_DeadlineQosPolicy *to); -OMG_DDS_API void __DDS_DeadlineQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_DeadlineQosPolicy { -// struct _DDS_Duration_t period; -//}; - -struct _DDS_LatencyBudgetQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_LatencyBudgetQosPolicy__copyIn(c_type dbType, const dds::core::policy::LatencyBudget *from, struct _DDS_LatencyBudgetQosPolicy *to); -OMG_DDS_API void __DDS_LatencyBudgetQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_LatencyBudgetQosPolicy { -// struct _DDS_Duration_t duration; -//}; - -enum _DDS_OwnershipQosPolicyKind -{ - _DDS_SHARED_OWNERSHIP_QOS, - _DDS_EXCLUSIVE_OWNERSHIP_QOS -}; -struct _DDS_OwnershipQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_OwnershipQosPolicy__copyIn(c_type dbType, const dds::core::policy::Ownership *from, struct _DDS_OwnershipQosPolicy *to); -OMG_DDS_API void __DDS_OwnershipQosPolicy__copyOut( - const void* _from, - void* _to); -struct _DDS_OwnershipQosPolicy -{ - enum _DDS_OwnershipQosPolicyKind kind; -}; - -#ifdef OMG_DDS_OWNERSHIP_SUPPORT -struct _DDS_OwnershipStrengthQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_OwnershipStrengthQosPolicy__copyIn(c_type dbType, const dds::core::policy::OwnershipStrength *from, struct _DDS_OwnershipStrengthQosPolicy *to); -OMG_DDS_API void __DDS_OwnershipStrengthQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_OwnershipStrengthQosPolicy { -// c_long value; -//}; -#endif // OMG_DDS_OWNERSHIP_SUPPORT - -enum _DDS_LivelinessQosPolicyKind -{ - _DDS_AUTOMATIC_LIVELINESS_QOS, - _DDS_MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, - _DDS_MANUAL_BY_TOPIC_LIVELINESS_QOS -}; -struct _DDS_LivelinessQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_LivelinessQosPolicy__copyIn(c_type dbType, const dds::core::policy::Liveliness *from, struct _DDS_LivelinessQosPolicy *to); -OMG_DDS_API void __DDS_LivelinessQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_LivelinessQosPolicy { -// enum _DDS_LivelinessQosPolicyKind kind; -// struct _DDS_Duration_t lease_duration; -//}; - -struct _DDS_TimeBasedFilterQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_TimeBasedFilterQosPolicy__copyIn(c_type dbType, const dds::core::policy::TimeBasedFilter *from, struct _DDS_TimeBasedFilterQosPolicy *to); -OMG_DDS_API void __DDS_TimeBasedFilterQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_TimeBasedFilterQosPolicy { -// struct _DDS_Duration_t minimum_separation; -//}; - -struct _DDS_PartitionQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_PartitionQosPolicy__copyIn(c_type dbType, const dds::core::policy::Partition *from, struct _DDS_PartitionQosPolicy *to); -OMG_DDS_API void __DDS_PartitionQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_PartitionQosPolicy { -// _DDS_StringSeq name; -//}; - -enum _DDS_ReliabilityQosPolicyKind -{ - _DDS_BEST_EFFORT_RELIABILITY_QOS, - _DDS_RELIABLE_RELIABILITY_QOS -}; -struct _DDS_ReliabilityQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_ReliabilityQosPolicy__copyIn(c_type dbType, const dds::core::policy::Reliability *from, struct _DDS_ReliabilityQosPolicy *to); -OMG_DDS_API void __DDS_ReliabilityQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_ReliabilityQosPolicy { -// enum _DDS_ReliabilityQosPolicyKind kind; -// struct _DDS_Duration_t max_blocking_time; -// c_bool synchronous; -//}; - -enum _DDS_DestinationOrderQosPolicyKind -{ - _DDS_BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS, - _DDS_BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS -}; -struct _DDS_DestinationOrderQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_DestinationOrderQosPolicy__copyIn(c_type dbType, const dds::core::policy::DestinationOrder *from, struct _DDS_DestinationOrderQosPolicy *to); -OMG_DDS_API void __DDS_DestinationOrderQosPolicy__copyOut( - const void* _from, - void* _to); -struct _DDS_DestinationOrderQosPolicy -{ - enum _DDS_DestinationOrderQosPolicyKind kind; -}; - -enum _DDS_HistoryQosPolicyKind -{ - _DDS_KEEP_LAST_HISTORY_QOS, - _DDS_KEEP_ALL_HISTORY_QOS -}; -struct _DDS_HistoryQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_HistoryQosPolicy__copyIn(c_type dbType, const dds::core::policy::History *from, struct _DDS_HistoryQosPolicy *to); -OMG_DDS_API void __DDS_HistoryQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_HistoryQosPolicy { -// enum _DDS_HistoryQosPolicyKind kind; -// c_long depth; -//}; - -struct _DDS_ResourceLimitsQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_ResourceLimitsQosPolicy__copyIn(c_type dbType, const dds::core::policy::ResourceLimits *from, struct _DDS_ResourceLimitsQosPolicy *to); -OMG_DDS_API void __DDS_ResourceLimitsQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_ResourceLimitsQosPolicy { -// c_long max_samples; -// c_long max_instances; -// c_long max_samples_per_instance; -//}; - -#ifdef OMG_DDS_PERSISTENCE_SUPPORT -struct _DDS_DurabilityServiceQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_DurabilityServiceQosPolicy__copyIn(c_type dbType, const dds::core::policy::DurabilityService *from, struct _DDS_DurabilityServiceQosPolicy *to); -OMG_DDS_API void __DDS_DurabilityServiceQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_DurabilityServiceQosPolicy { -// struct _DDS_Duration_t service_cleanup_delay; -// enum _DDS_HistoryQosPolicyKind history_kind; -// c_long history_depth; -// c_long max_samples; -// c_long max_instances; -// c_long max_samples_per_instance; -//}; -#endif // OMG_DDS_PERSISTENCE_SUPPORT - -struct _DDS_ProductDataQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_ProductDataQosPolicy__copyIn(c_type dbType, const org::opensplice::core::policy::ProductData *from, struct _DDS_ProductDataQosPolicy *to); -OMG_DDS_API void __DDS_ProductDataQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_ProductDataQosPolicy { -// c_string value; -//}; - -struct _DDS_EntityFactoryQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_EntityFactoryQosPolicy__copyIn(c_type dbType, const dds::core::policy::EntityFactory *from, struct _DDS_EntityFactoryQosPolicy *to); -OMG_DDS_API void __DDS_EntityFactoryQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_EntityFactoryQosPolicy { -// c_bool autoenable_created_entities; -//}; - -struct _DDS_ShareQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_ShareQosPolicy__copyIn(c_type dbType, const org::opensplice::core::policy::Share *from, struct _DDS_ShareQosPolicy *to); -OMG_DDS_API void __DDS_ShareQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_ShareQosPolicy { -// c_string name; -// c_bool enable; -//}; - -struct _DDS_WriterDataLifecycleQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_WriterDataLifecycleQosPolicy__copyIn(c_type dbType, const dds::core::policy::WriterDataLifecycle *from, struct _DDS_WriterDataLifecycleQosPolicy *to); -OMG_DDS_API void __DDS_WriterDataLifecycleQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_WriterDataLifecycleQosPolicy { -// c_bool autodispose_unregistered_instances; -// struct _DDS_Duration_t autopurge_suspended_samples_delay; -// struct _DDS_Duration_t autounregister_instance_delay; -//}; - -enum _DDS_InvalidSampleVisibilityQosPolicyKind -{ - _DDS_NO_INVALID_SAMPLES, - _DDS_MINIMUM_INVALID_SAMPLES, - _DDS_ALL_INVALID_SAMPLES -}; -struct _DDS_InvalidSampleVisibilityQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_InvalidSampleVisibilityQosPolicy__copyIn(c_type dbType, const org::opensplice::core::policy::InvalidSampleVisibility *from, struct _DDS_InvalidSampleVisibilityQosPolicy *to); -OMG_DDS_API void __DDS_InvalidSampleVisibilityQosPolicy__copyOut( - const void* _from, - void* _to); -struct _DDS_InvalidSampleVisibilityQosPolicy -{ - enum _DDS_InvalidSampleVisibilityQosPolicyKind kind; -}; - -struct _DDS_SubscriptionKeyQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_SubscriptionKeyQosPolicy__copyIn(c_type dbType, const org::opensplice::core::policy::SubscriptionKey *from, struct _DDS_SubscriptionKeyQosPolicy *to); -OMG_DDS_API void __DDS_SubscriptionKeyQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_SubscriptionKeyQosPolicy { -// c_bool use_key_list; -// _DDS_StringSeq key_list; -//}; - -struct _DDS_ReaderDataLifecycleQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_ReaderDataLifecycleQosPolicy__copyIn(c_type dbType, const dds::core::policy::ReaderDataLifecycle *from, struct _DDS_ReaderDataLifecycleQosPolicy *to); -OMG_DDS_API void __DDS_ReaderDataLifecycleQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_ReaderDataLifecycleQosPolicy { -// struct _DDS_Duration_t autopurge_nowriter_samples_delay; -// struct _DDS_Duration_t autopurge_disposed_samples_delay; -// c_bool autopurge_dispose_all; -// c_bool enable_invalid_samples; -// struct _DDS_InvalidSampleVisibilityQosPolicy invalid_sample_visibility; -//}; - -struct _DDS_UserKeyQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_UserKeyQosPolicy__copyIn(c_type dbType, const org::opensplice::core::policy::SubscriptionKey *from, struct _DDS_UserKeyQosPolicy *to); -OMG_DDS_API void __DDS_UserKeyQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_UserKeyQosPolicy { -// c_bool enable; -// c_string expression; -//}; - -struct _DDS_ReaderLifespanQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_ReaderLifespanQosPolicy__copyIn(c_type dbType, const org::opensplice::core::policy::ReaderLifespan *from, struct _DDS_ReaderLifespanQosPolicy *to); -OMG_DDS_API void __DDS_ReaderLifespanQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_ReaderLifespanQosPolicy { -// c_bool use_lifespan; -// struct _DDS_Duration_t duration; -//}; - -struct _DDS_TypeHash; -//OMG_DDS_API v_copyin_result __DDS_TypeHash__copyIn(c_type dbType, const class org::opensplice::topic::TypeHash *from, struct _DDS_TypeHash *to); -OMG_DDS_API void __DDS_TypeHash__copyOut( - const void* _from, - void* _to); -//struct _DDS_TypeHash { -// c_ulonglong msb; -// c_ulonglong lsb; -//}; - -struct _DDS_ParticipantBuiltinTopicData; -//OMG_DDS_API v_copyin_result __DDS_ParticipantBuiltinTopicData__copyIn(c_type dbType, const dds::topic::ParticipantBuiltinTopicData *from, struct _DDS_ParticipantBuiltinTopicData *to); -OMG_DDS_API void __DDS_ParticipantBuiltinTopicData__copyOut( - const void* _from, - void* _to); -//struct _DDS_ParticipantBuiltinTopicData { -// _DDS_BuiltinTopicKey_t key; -// struct _DDS_UserDataQosPolicy user_data; -//}; - -struct _DDS_TopicBuiltinTopicData; -//OMG_DDS_API v_copyin_result __DDS_TopicBuiltinTopicData__copyIn(c_type dbType, const dds::topic::TopicBuiltinTopicData *from, struct _DDS_TopicBuiltinTopicData *to); -OMG_DDS_API void __DDS_TopicBuiltinTopicData__copyOut( - const void* _from, - void* _to); -//struct _DDS_TopicBuiltinTopicData { -// _DDS_BuiltinTopicKey_t key; -// c_string name; -// c_string type_name; -// struct _DDS_DurabilityQosPolicy durability; -// struct _DDS_DurabilityServiceQosPolicy durability_service; -// struct _DDS_DeadlineQosPolicy deadline; -// struct _DDS_LatencyBudgetQosPolicy latency_budget; -// struct _DDS_LivelinessQosPolicy liveliness; -// struct _DDS_ReliabilityQosPolicy reliability; -// struct _DDS_TransportPriorityQosPolicy transport_priority; -// struct _DDS_LifespanQosPolicy lifespan; -// struct _DDS_DestinationOrderQosPolicy destination_order; -// struct _DDS_HistoryQosPolicy history; -// struct _DDS_ResourceLimitsQosPolicy resource_limits; -// struct _DDS_OwnershipQosPolicy ownership; -// struct _DDS_TopicDataQosPolicy topic_data; -//}; - -struct _DDS_TypeBuiltinTopicData; -//OMG_DDS_API v_copyin_result __DDS_TypeBuiltinTopicData__copyIn(c_type dbType, const org::opensplice::topic::TypeBuiltinTopicData *from, struct _DDS_TypeBuiltinTopicData *to); -OMG_DDS_API void __DDS_TypeBuiltinTopicData__copyOut( - const void* _from, - void* _to); -//struct _DDS_TypeBuiltinTopicData { -// c_string name; -// _DDS_DataRepresentationId_t data_representation_id; -// struct _DDS_TypeHash type_hash; -// _DDS_octSeq meta_data; -// _DDS_octSeq extentions; -//}; - -struct _DDS_PublicationBuiltinTopicData; -//OMG_DDS_API v_copyin_result __DDS_PublicationBuiltinTopicData__copyIn(c_type dbType, const dds::topic::PublicationBuiltinTopicData *from, struct _DDS_PublicationBuiltinTopicData *to); -OMG_DDS_API void __DDS_PublicationBuiltinTopicData__copyOut( - const void* _from, - void* _to); -//struct _DDS_PublicationBuiltinTopicData { -// _DDS_BuiltinTopicKey_t key; -// _DDS_BuiltinTopicKey_t participant_key; -// c_string topic_name; -// c_string type_name; -// struct _DDS_DurabilityQosPolicy durability; -// struct _DDS_DeadlineQosPolicy deadline; -// struct _DDS_LatencyBudgetQosPolicy latency_budget; -// struct _DDS_LivelinessQosPolicy liveliness; -// struct _DDS_ReliabilityQosPolicy reliability; -// struct _DDS_LifespanQosPolicy lifespan; -// struct _DDS_DestinationOrderQosPolicy destination_order; -// struct _DDS_UserDataQosPolicy user_data; -// struct _DDS_OwnershipQosPolicy ownership; -// struct _DDS_OwnershipStrengthQosPolicy ownership_strength; -// struct _DDS_PresentationQosPolicy presentation; -// struct _DDS_PartitionQosPolicy partition; -// struct _DDS_TopicDataQosPolicy topic_data; -// struct _DDS_GroupDataQosPolicy group_data; -//}; - -struct _DDS_SubscriptionBuiltinTopicData; -//OMG_DDS_API v_copyin_result __DDS_SubscriptionBuiltinTopicData__copyIn(c_type dbType, const dds::topic::SubscriptionBuiltinTopicData *from, struct _DDS_SubscriptionBuiltinTopicData *to); -OMG_DDS_API void __DDS_SubscriptionBuiltinTopicData__copyOut( - const void* _from, - void* _to); -//struct _DDS_SubscriptionBuiltinTopicData { -// _DDS_BuiltinTopicKey_t key; -// _DDS_BuiltinTopicKey_t participant_key; -// c_string topic_name; -// c_string type_name; -// struct _DDS_DurabilityQosPolicy durability; -// struct _DDS_DeadlineQosPolicy deadline; -// struct _DDS_LatencyBudgetQosPolicy latency_budget; -// struct _DDS_LivelinessQosPolicy liveliness; -// struct _DDS_ReliabilityQosPolicy reliability; -// struct _DDS_OwnershipQosPolicy ownership; -// struct _DDS_DestinationOrderQosPolicy destination_order; -// struct _DDS_UserDataQosPolicy user_data; -// struct _DDS_TimeBasedFilterQosPolicy time_based_filter; -// struct _DDS_PresentationQosPolicy presentation; -// struct _DDS_PartitionQosPolicy partition; -// struct _DDS_TopicDataQosPolicy topic_data; -// struct _DDS_GroupDataQosPolicy group_data; -//}; - -struct _DDS_CMParticipantBuiltinTopicData; -//OMG_DDS_API v_copyin_result __DDS_CMParticipantBuiltinTopicData__copyIn(c_type dbType, const org::opensplice::topic::CMParticipantBuiltinTopicData *from, struct _DDS_CMParticipantBuiltinTopicData *to); -OMG_DDS_API void __DDS_CMParticipantBuiltinTopicData__copyOut( - const void* _from, - void* _to); -//struct _DDS_CMParticipantBuiltinTopicData { -// _DDS_BuiltinTopicKey_t key; -// struct _DDS_ProductDataQosPolicy product; -//}; - - -struct _DDS_CMPublisherBuiltinTopicData; -//OMG_DDS_API v_copyin_result __DDS_CMPublisherBuiltinTopicData__copyIn(c_type dbType, const org::opensplice::topic::CMPublisherBuiltinTopicData *from, struct _DDS_CMPublisherBuiltinTopicData *to); -OMG_DDS_API void __DDS_CMPublisherBuiltinTopicData__copyOut( - const void* _from, - void* _to); -//struct _DDS_CMPublisherBuiltinTopicData { -// _DDS_BuiltinTopicKey_t key; -// struct _DDS_ProductDataQosPolicy product; -// _DDS_BuiltinTopicKey_t participant_key; -// c_string name; -// struct _DDS_EntityFactoryQosPolicy entity_factory; -// struct _DDS_PartitionQosPolicy partition; -//}; - -struct _DDS_CMSubscriberBuiltinTopicData; -//OMG_DDS_API v_copyin_result __DDS_CMSubscriberBuiltinTopicData__copyIn(c_type dbType, const org::opensplice::topic::CMSubscriberBuiltinTopicData *from, struct _DDS_CMSubscriberBuiltinTopicData *to); -OMG_DDS_API void __DDS_CMSubscriberBuiltinTopicData__copyOut( - const void* _from, - void* _to); -//struct _DDS_CMSubscriberBuiltinTopicData { -// _DDS_BuiltinTopicKey_t key; -// struct _DDS_ProductDataQosPolicy product; -// _DDS_BuiltinTopicKey_t participant_key; -// c_string name; -// struct _DDS_EntityFactoryQosPolicy entity_factory; -// struct _DDS_ShareQosPolicy share; -// struct _DDS_PartitionQosPolicy partition; -//}; - -struct _DDS_CMDataWriterBuiltinTopicData; -//OMG_DDS_API v_copyin_result __DDS_CMDataWriterBuiltinTopicData__copyIn(c_type dbType, const org::opensplice::topic::CMDataWriterBuiltinTopicData *from, struct _DDS_CMDataWriterBuiltinTopicData *to); -OMG_DDS_API void __DDS_CMDataWriterBuiltinTopicData__copyOut( - const void* _from, - void* _to); -//struct _DDS_CMDataWriterBuiltinTopicData { -// _DDS_BuiltinTopicKey_t key; -// struct _DDS_ProductDataQosPolicy product; -// _DDS_BuiltinTopicKey_t publisher_key; -// c_string name; -// struct _DDS_HistoryQosPolicy history; -// struct _DDS_ResourceLimitsQosPolicy resource_limits; -// struct _DDS_WriterDataLifecycleQosPolicy writer_data_lifecycle; -//}; - -struct _DDS_CMDataReaderBuiltinTopicData; -//OMG_DDS_API v_copyin_result __DDS_CMDataReaderBuiltinTopicData__copyIn(c_type dbType, const org::opensplice::topic::CMDataReaderBuiltinTopicData *from, struct _DDS_CMDataReaderBuiltinTopicData *to); -OMG_DDS_API void __DDS_CMDataReaderBuiltinTopicData__copyOut( - const void* _from, - void* _to); -//struct _DDS_CMDataReaderBuiltinTopicData { -// _DDS_BuiltinTopicKey_t key; -// struct _DDS_ProductDataQosPolicy product; -// _DDS_BuiltinTopicKey_t subscriber_key; -// c_string name; -// struct _DDS_HistoryQosPolicy history; -// struct _DDS_ResourceLimitsQosPolicy resource_limits; -// struct _DDS_ReaderDataLifecycleQosPolicy reader_data_lifecycle; -// struct _DDS_UserKeyQosPolicy subscription_keys; -// struct _DDS_ReaderLifespanQosPolicy reader_lifespan; -// struct _DDS_ShareQosPolicy share; -//}; - - - -#endif //EPROSIMA_DDS_BUILTINTOPICSSPLTYPES_H_ diff --git a/include/dds/core/detail/dds_builtinTopics_DCPS.hpp b/include/dds/core/detail/dds_builtinTopics_DCPS.hpp deleted file mode 100644 index f0b769b667e..00000000000 --- a/include/dds/core/detail/dds_builtinTopics_DCPS.hpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_BUILTINTOPICS_HPP_ -#define EPROSIMA_DDS_BUILTINTOPICS_HPP_ - -#include "dds/dds.hpp" - -#include "dds/core/detail/dds_builtinTopics.h" -#include "dds/core/detail/dds_builtinTopicsSplDcps.h" - -#endif //EPROSIMA_DDS_BUILTINTOPICS_HPP_ diff --git a/include/dds/core/detail/dds_dcps_builtintopics.h b/include/dds/core/detail/dds_dcps_builtintopics.h deleted file mode 100644 index d6281dedd16..00000000000 --- a/include/dds/core/detail/dds_dcps_builtintopics.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_DCPS_BUILTINTOPICS_H_ -#define EPROSIMA_DDS_DCPS_BUILTINTOPICS_H_ - -#include - -namespace DDS { -typedef dds::core::Time Time_t; - -// typedef org::opensplice::core::policy::SchedulingKind::Type SchedulingClassQosPolicyKind; -// typedef org::opensplice::core::policy::SchedulingKind::Type SchedulingClassQosPolicy; -// typedef org::opensplice::core::policy::SchedulingPriorityKind::Type SchedulingPriorityQosPolicyKind; -// typedef org::opensplice::core::policy::SchedulingPriorityKind::Type SchedulingPriorityQosPolicy; -// typedef org::opensplice::core::policy::TScheduling< -// org::opensplice::core::policy::SchedulingDelegate> SchedulingQosPolicy; - -typedef dds::domain::qos::DomainParticipantQos DomainParticipantQos; -typedef dds::topic::qos::TopicQos TopicQos; -typedef dds::pub::qos::DataWriterQos DataWriterQos; -typedef dds::pub::qos::PublisherQos PublisherQos; -typedef dds::sub::qos::DataReaderQos DataReaderQos; -typedef dds::sub::qos::SubscriberQos SubscriberQos; -} //namespace DDS - -#endif //EPROSIMA_DDS_DCPS_BUILTINTOPICS_H_ diff --git a/include/dds/core/detail/dds_dcps_builtintopicsSplDcps.h b/include/dds/core/detail/dds_dcps_builtintopicsSplDcps.h deleted file mode 100644 index f06a177d5b0..00000000000 --- a/include/dds/core/detail/dds_dcps_builtintopicsSplDcps.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_DCPS_BUILTINTOPICSSPLTYPES_H_ -#define EPROSIMA_DDS_DCPS_BUILTINTOPICSSPLTYPES_H_ - -#include - -struct _DDS_Time_t; -//OMG_DDS_API v_copyin_result __DDS_Time_t__copyIn(c_type dbType, const dds::core::Time *from, struct _DDS_Time_t *to); -OMG_DDS_API void __DDS_Time_t__copyOut( - const void* _from, - void* _to); -//struct _DDS_Time_t { -// c_long sec; -// c_ulong nanosec; -//}; - -enum _DDS_SchedulingClassQosPolicyKind -{ - _DDS_SCHEDULE_DEFAULT, - _DDS_SCHEDULE_TIMESHARING, - _DDS_SCHEDULE_REALTIME -}; - -struct _DDS_SchedulingClassQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_SchedulingClassQosPolicy__copyIn(c_type dbType, const org::opensplice::core::policy::SchedulingKind *from, struct _DDS_SchedulingClassQosPolicy *to); -OMG_DDS_API void __DDS_SchedulingClassQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_SchedulingClassQosPolicy { -// enum _DDS_SchedulingClassQosPolicyKind kind; -//}; - -enum _DDS_SchedulingPriorityQosPolicyKind -{ - _DDS_PRIORITY_RELATIVE, - _DDS_PRIORITY_ABSOLUTE -}; - -struct _DDS_SchedulingPriorityQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_SchedulingPriorityQosPolicy__copyIn(c_type dbType, const org::opensplice::core::policy::SchedulingPriorityKind *from, struct _DDS_SchedulingPriorityQosPolicy *to); -OMG_DDS_API void __DDS_SchedulingPriorityQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_SchedulingPriorityQosPolicy { -// enum _DDS_SchedulingPriorityQosPolicyKind kind; -//}; - -struct _DDS_SchedulingQosPolicy; -//OMG_DDS_API v_copyin_result __DDS_SchedulingQosPolicy__copyIn(c_type dbType, const DDS::SchedulingQosPolicy *from, struct _DDS_SchedulingQosPolicy *to); -OMG_DDS_API void __DDS_SchedulingQosPolicy__copyOut( - const void* _from, - void* _to); -//struct _DDS_SchedulingQosPolicy { -// struct _DDS_SchedulingClassQosPolicy scheduling_class; -// struct _DDS_SchedulingPriorityQosPolicy scheduling_priority_kind; -// c_long scheduling_priority; -//}; - -struct _DDS_DomainParticipantQos; -//OMG_DDS_API v_copyin_result __DDS_DomainParticipantQos__copyIn(c_type dbType, const dds::domain::qos::DomainParticipantQos *from, struct _DDS_DomainParticipantQos *to); -OMG_DDS_API void __DDS_DomainParticipantQos__copyOut( - const void* _from, - void* _to); -//struct _DDS_DomainParticipantQos { -// struct _DDS_UserDataQosPolicy user_data; -// struct _DDS_EntityFactoryQosPolicy entity_factory; -// struct _DDS_SchedulingQosPolicy watchdog_scheduling; -// struct _DDS_SchedulingQosPolicy listener_scheduling; -//}; - -struct _DDS_TopicQos; -//OMG_DDS_API v_copyin_result __DDS_TopicQos__copyIn(c_type dbType, const dds::topic::qos::TopicQos *from, struct _DDS_TopicQos *to); -OMG_DDS_API void __DDS_TopicQos__copyOut( - const void* _from, - void* _to); -//struct _DDS_TopicQos { -// struct _DDS_TopicDataQosPolicy topic_data; -// struct _DDS_DurabilityQosPolicy durability; -// struct _DDS_DurabilityServiceQosPolicy durability_service; -// struct _DDS_DeadlineQosPolicy deadline; -// struct _DDS_LatencyBudgetQosPolicy latency_budget; -// struct _DDS_LivelinessQosPolicy liveliness; -// struct _DDS_ReliabilityQosPolicy reliability; -// struct _DDS_DestinationOrderQosPolicy destination_order; -// struct _DDS_HistoryQosPolicy history; -// struct _DDS_ResourceLimitsQosPolicy resource_limits; -// struct _DDS_TransportPriorityQosPolicy transport_priority; -// struct _DDS_LifespanQosPolicy lifespan; -// struct _DDS_OwnershipQosPolicy ownership; -//}; - -struct _DDS_DataWriterQos; -//OMG_DDS_API v_copyin_result __DDS_DataWriterQos__copyIn(c_type dbType, const dds::pub::qos::DataWriterQos *from, struct _DDS_DataWriterQos *to); -OMG_DDS_API void __DDS_DataWriterQos__copyOut( - const void* _from, - void* _to); -//struct _DDS_DataWriterQos { -// struct _DDS_DurabilityQosPolicy durability; -// struct _DDS_DeadlineQosPolicy deadline; -// struct _DDS_LatencyBudgetQosPolicy latency_budget; -// struct _DDS_LivelinessQosPolicy liveliness; -// struct _DDS_ReliabilityQosPolicy reliability; -// struct _DDS_DestinationOrderQosPolicy destination_order; -// struct _DDS_HistoryQosPolicy history; -// struct _DDS_ResourceLimitsQosPolicy resource_limits; -// struct _DDS_TransportPriorityQosPolicy transport_priority; -// struct _DDS_LifespanQosPolicy lifespan; -// struct _DDS_UserDataQosPolicy user_data; -// struct _DDS_OwnershipQosPolicy ownership; -// struct _DDS_OwnershipStrengthQosPolicy ownership_strength; -// struct _DDS_WriterDataLifecycleQosPolicy writer_data_lifecycle; -//}; - -struct _DDS_PublisherQos; -//OMG_DDS_API v_copyin_result __DDS_PublisherQos__copyIn(c_type dbType, const dds::pub::qos::PublisherQos *from, struct _DDS_PublisherQos *to); -OMG_DDS_API void __DDS_PublisherQos__copyOut( - const void* _from, - void* _to); -//struct _DDS_PublisherQos { -// struct _DDS_PresentationQosPolicy presentation; -// struct _DDS_PartitionQosPolicy partition; -// struct _DDS_GroupDataQosPolicy group_data; -// struct _DDS_EntityFactoryQosPolicy entity_factory; -//}; - -struct _DDS_DataReaderQos; -//OMG_DDS_API v_copyin_result __DDS_DataReaderQos__copyIn(c_type dbType, const dds::sub::qos::DataReaderQos *from, struct _DDS_DataReaderQos *to); -OMG_DDS_API void __DDS_DataReaderQos__copyOut( - const void* _from, - void* _to); -//struct _DDS_DataReaderQos { -// struct _DDS_DurabilityQosPolicy durability; -// struct _DDS_DeadlineQosPolicy deadline; -// struct _DDS_LatencyBudgetQosPolicy latency_budget; -// struct _DDS_LivelinessQosPolicy liveliness; -// struct _DDS_ReliabilityQosPolicy reliability; -// struct _DDS_DestinationOrderQosPolicy destination_order; -// struct _DDS_HistoryQosPolicy history; -// struct _DDS_ResourceLimitsQosPolicy resource_limits; -// struct _DDS_UserDataQosPolicy user_data; -// struct _DDS_OwnershipQosPolicy ownership; -// struct _DDS_TimeBasedFilterQosPolicy time_based_filter; -// struct _DDS_ReaderDataLifecycleQosPolicy reader_data_lifecycle; -// struct _DDS_SubscriptionKeyQosPolicy subscription_keys; -// struct _DDS_ReaderLifespanQosPolicy reader_lifespan; -// struct _DDS_ShareQosPolicy share; -//}; - -struct _DDS_SubscriberQos; -//OMG_DDS_API v_copyin_result __DDS_SubscriberQos__copyIn(c_type dbType, const dds::sub::qos::SubscriberQos *from, struct _DDS_SubscriberQos *to); -OMG_DDS_API void __DDS_SubscriberQos__copyOut( - const void* _from, - void* _to); -//struct _DDS_SubscriberQos { -// struct _DDS_PresentationQosPolicy presentation; -// struct _DDS_PartitionQosPolicy partition; -// struct _DDS_GroupDataQosPolicy group_data; -// struct _DDS_EntityFactoryQosPolicy entity_factory; -// struct _DDS_ShareQosPolicy share; -//}; - -#endif //EPROSIMA_DDS_DCPS_BUILTINTOPICSSPLTYPES_H_ diff --git a/include/dds/core/detail/dds_dcps_builtintopics_DCPS.hpp b/include/dds/core/detail/dds_dcps_builtintopics_DCPS.hpp deleted file mode 100644 index d6a2c5c0837..00000000000 --- a/include/dds/core/detail/dds_dcps_builtintopics_DCPS.hpp +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_DCPS_BUILTINTOPICS_DCPS_HPP_ -#define EPROSIMA_DDS_DCPS_BUILTINTOPICS_DCPS_HPP_ - -#include "dds/core/detail/dds_dcps_builtintopics.h" -#include "dds/core/detail/dds_dcps_builtintopicsSplDcps.h" - -#endif //EPROSIMA_DDS_DCPS_BUILTINTOPICS_DCPS_HPP_ diff --git a/include/dds/core/detail/ddscore.hpp b/include/dds/core/detail/ddscore.hpp deleted file mode 100644 index 25aaf457bf5..00000000000 --- a/include/dds/core/detail/ddscore.hpp +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_PACKAGE_DETAIL_INCLUDE_HPP_ -#define EPROSIMA_DDS_CORE_PACKAGE_DETAIL_INCLUDE_HPP_ - -/* Nothing to 'post' include. */ - -#endif //EPROSIMA_DDS_CORE_PACKAGE_DETAIL_INCLUDE_HPP_ diff --git a/include/dds/core/detail/inttypes.hpp b/include/dds/core/detail/inttypes.hpp deleted file mode 100644 index 226a0a409aa..00000000000 --- a/include/dds/core/detail/inttypes.hpp +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_DETAIL_INTTYPES_HPP_ -#define EPROSIMA_DDS_CORE_DETAIL_INTTYPES_HPP_ - -#include - -#endif //EPROSIMA_DDS_CORE_DETAIL_INTTYPES_HPP_ - diff --git a/include/dds/core/detail/macros.hpp b/include/dds/core/detail/macros.hpp deleted file mode 100644 index 5c1446be7bd..00000000000 --- a/include/dds/core/detail/macros.hpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_DETAIL_MACROS_HPP_ -#define EPROSIMA_DDS_CORE_DETAIL_MACROS_HPP_ - -#include - -#include - -// Constants -#define OMG_DDS_DEFAULT_STATE_BIT_COUNT_DETAIL size_t(16) -#define OMG_DDS_DEFAULT_STATUS_COUNT_DETAIL size_t(16) -// ========================================================================== - -// Static Assert -#define OMG_DDS_STATIC_ASSERT_DETAIL(...) static_assert(__VA_ARGS__, #__VA_ARGS__) -// ========================================================================== - -// Logging Macros -#define OMG_DDS_LOG_DETAIL(kind, msg) \ - std::cout << "[" << kind << "]: " << msg << std::endl; -// ========================================================================== - - -#define OMG_DDS_API_DETAIL RTPS_DllAPI -// ========================================================================== - - -#endif //EPROSIMA_DDS_CORE_DETAIL_MACROS_HPP_ diff --git a/include/dds/core/detail/module_docs.hpp b/include/dds/core/detail/module_docs.hpp deleted file mode 100644 index 534e274d0f9..00000000000 --- a/include/dds/core/detail/module_docs.hpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_DETAIL_MODULE_DOCS_HPP_ -#define EPROSIMA_DDS_CORE_DETAIL_MODULE_DOCS_HPP_ - -/** - * @file - * This file exists only to be fed to doxygen. There is quite - * literally nothing else to see here. - */ - -/** - * @addtogroup isocpp2_dcps ISO/IEC C++ 2 API for DDS Data-centric Publish-Subscribe (DCPS) - */ -/** @{*/ -/** @dir dds */ -/** @}*/ - -/** - * @addtogroup isocpp2_dcps_domain Domain Module - ::dds::domain - * @ingroup isocpp2_dcps */ -/** @{*/ -/** @dir dds/domain */ -/** @}*/ - - -/** - * @addtogroup isocpp2_dcps_topic Topic Module- ::dds::topic - * @ingroup isocpp2_dcps */ -/** @{*/ -/** @dir dds/topic */ -/** @}*/ - -/** - * @addtogroup isocpp2_dcps_pub Publication Module - ::dds::pub - * @ingroup isocpp2_dcps */ -/** @{*/ -/** @dir dds/pub */ -/** @}*/ - - -/** - * @addtogroup isocpp2_dcps_sub Subscription Module - ::dds::sub - * @ingroup isocpp2_dcps */ -/** @{*/ -/** @dir dds/sub */ -/** @}*/ - -/** - * @addtogroup isocpp2_dcps_core Core / Common Module - ::dds::core - * @ingroup isocpp2_dcps */ -/** @{*/ -/** @dir dds/core */ -/** @}*/ - - -/** - * @addtogroup examplesdcpsisocpp ISO/IEC C++ DCPS PSM Examples - */ -/** @{*/ -/** @dir examples/common */ -/** @}*/ - - - -/** - * @ingroup isocpp2_dcps - */ -namespace dds { -/** - * @ingroup isocpp2_dcps_domain - * @ingroup isocpp2_dcps */ -namespace domain { -/** @ingroup isocpp2_dcps_domain - * @ingroup isocpp2_dcps */ -namespace qos { -namespace detail {} -} //namespace qos -namespace detail {} -} //namespace domain -/** - * @ingroup isocpp2_dcps_topic - * @ingroup isocpp2_dcps */ -namespace topic { -/** @ingroup isocpp2_dcps_topic - * @ingroup isocpp2_dcps */ -namespace qos { -namespace detail {} -} //namespace qos -namespace detail {} -} //namespace topic -/** - * @ingroup isocpp2_dcps_pub - * @ingroup isocpp2_dcps */ -namespace pub { -/** @ingroup isocpp2_dcps_pub - * @ingroup isocpp2_dcps */ -namespace qos { -namespace detail {} -} //namespace qos -namespace detail {} -} //namespace pub -/** - * @ingroup isocpp2_dcps_sub - * @ingroup isocpp2_dcps */ -namespace sub { -/** @ingroup isocpp2_dcps_sub - * @ingroup isocpp2_dcps */ -namespace cond { -namespace detail {} -} //namespace cond -/** @ingroup isocpp2_dcps_sub - * @ingroup isocpp2_dcps */ -namespace functors { -namespace detail {} -} //namespace functors -/** @ingroup isocpp2_dcps_sub - * @ingroup isocpp2_dcps */ -namespace status {} -/** @ingroup isocpp2_dcps_sub - * @ingroup isocpp2_dcps */ -namespace qos { -namespace detail {} -} //namespace qos -} //namespace sub -/** - * @ingroup isocpp2_dcps_core - * @ingroup isocpp2_dcps */ -namespace core { -/** @ingroup isocpp2_dcps_core - * @ingroup isocpp2_dcps */ -namespace policy { -namespace detail {} -} //namespace policy -/** @ingroup isocpp2_dcps_core - * @ingroup isocpp2_dcps */ -namespace cond { -namespace detail {} -} //namespace cond -/** @ingroup isocpp2_dcps_core - * @ingroup isocpp2_dcps */ -namespace status { -namespace detail {} -} //namespace status -namespace detail {} -} //namespace core -} //namespace dds - - -#endif //EPROSIMA_DDS_CORE_DETAIL_MODULE_DOCS_HPP_ diff --git a/include/dds/core/detail/old_win_stdint.h b/include/dds/core/detail/old_win_stdint.h deleted file mode 100644 index 26fa0a1b7b3..00000000000 --- a/include/dds/core/detail/old_win_stdint.h +++ /dev/null @@ -1,247 +0,0 @@ -/** - * @file - * This file provides definitions for stdint header types for versions of - * Windows that didn't have it. It was discovered on the intahwebs at - * http://snipplr.com/view/18199/stdinth/ where it was described thus: - * "A public domain stdint.h. Original code is from a public domain version - * in the MinGW distribution. This one has been modified to fix a couple bugs - * (to make some macros 64-bit aware) and to make it compatible with VC6." - * It was published there on 08/12/09 - * @see dds/core/detail/inttypes.h - */ - -/* ISO C9x 7.18 Integer types - * Based on ISO/IEC SC22/WG14 9899 Committee draft (SC22 N2794) - * - * THIS SOFTWARE IS NOT COPYRIGHTED - * - * Contributor: Danny Smith - * - * This source code is offered for use in the public domain. You may - * use, modify or distribute it freely. - * - * This code is distributed in the hope that it will be useful but - * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY - * DISCLAIMED. This includes but is not limited to warranties of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * Date: 2000-12-02 - * - * mwb: This was modified in the following ways: - * - * - make it compatible with Visual C++ 6 (which uses - * non-standard keywords and suffixes for 64-bit types) - * - some environments need stddef.h included (for wchar stuff?) - * - handle the fact that Microsoft's limits.h header defines - * SIZE_MAX - * - make corrections for SIZE_MAX, INTPTR_MIN, INTPTR_MAX, UINTPTR_MAX, - * PTRDIFF_MIN, PTRDIFF_MAX, SIG_ATOMIC_MIN, and SIG_ATOMIC_MAX - * to be 64-bit aware. - */ - - -#ifndef _STDINT_H -#define _STDINT_H -#define __need_wint_t -#define __need_wchar_t -#include -#include - -#if _MSC_VER && (_MSC_VER < 1300) -/* using MSVC 6 or earlier - no "long long" type, but might have _int64 type */ -#define __STDINT_LONGLONG __int64 -#define __STDINT_LONGLONG_SUFFIX i64 -#else -#define __STDINT_LONGLONG long long -#define __STDINT_LONGLONG_SUFFIX LL -#endif - -#if !defined( PASTE) -#define PASTE2( x, y) x ## y -#define PASTE( x, y) PASTE2( x, y) -#endif /* PASTE */ - - -/* 7.18.1.1 Exact-width integer types */ -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef short int16_t; -typedef unsigned short uint16_t; -typedef int int32_t; -typedef unsigned uint32_t; -typedef __STDINT_LONGLONG int64_t; -typedef unsigned __STDINT_LONGLONG uint64_t; - -/* 7.18.1.2 Minimum-width integer types */ -typedef signed char int_least8_t; -typedef unsigned char uint_least8_t; -typedef short int_least16_t; -typedef unsigned short uint_least16_t; -typedef int int_least32_t; -typedef unsigned uint_least32_t; -typedef __STDINT_LONGLONG int_least64_t; -typedef unsigned __STDINT_LONGLONG uint_least64_t; - -/* 7.18.1.3 Fastest minimum-width integer types - * Not actually guaranteed to be fastest for all purposes - * Here we use the exact-width types for 8 and 16-bit ints. - */ -typedef char int_fast8_t; -typedef unsigned char uint_fast8_t; -typedef short int_fast16_t; -typedef unsigned short uint_fast16_t; -typedef int int_fast32_t; -typedef unsigned int uint_fast32_t; -typedef __STDINT_LONGLONG int_fast64_t; -typedef unsigned __STDINT_LONGLONG uint_fast64_t; - -/* 7.18.1.4 Integer types capable of holding object pointers */ -#ifndef _INTPTR_T_DEFINED -#define _INTPTR_T_DEFINED -#ifdef _WIN64 -typedef __STDINT_LONGLONG intptr_t -#else -typedef int intptr_t; -#endif /* _WIN64 */ -#endif /* _INTPTR_T_DEFINED */ - -#ifndef _UINTPTR_T_DEFINED -#define _UINTPTR_T_DEFINED -#ifdef _WIN64 -typedef unsigned __STDINT_LONGLONG uintptr_t -#else -typedef unsigned int uintptr_t; -#endif /* _WIN64 */ -#endif /* _UINTPTR_T_DEFINED */ - -/* 7.18.1.5 Greatest-width integer types */ -typedef __STDINT_LONGLONG intmax_t; -typedef unsigned __STDINT_LONGLONG uintmax_t; - -/* 7.18.2 Limits of specified-width integer types */ -#if !defined ( __cplusplus) || defined (__STDC_LIMIT_MACROS) - -/* 7.18.2.1 Limits of exact-width integer types */ -#define INT8_MIN (-128) -#define INT16_MIN (-32768) -#define INT32_MIN (-2147483647 - 1) -#define INT64_MIN (PASTE( -9223372036854775807, __STDINT_LONGLONG_SUFFIX) - 1) - -#define INT8_MAX 127 -#define INT16_MAX 32767 -#define INT32_MAX 2147483647 -#define INT64_MAX (PASTE( 9223372036854775807, __STDINT_LONGLONG_SUFFIX)) - -#define UINT8_MAX 0xff /* 255U */ -#define UINT16_MAX 0xffff /* 65535U */ -#define UINT32_MAX 0xffffffff /* 4294967295U */ -#define UINT64_MAX (PASTE( 0xffffffffffffffffU, __STDINT_LONGLONG_SUFFIX)) /* 18446744073709551615ULL */ - -/* 7.18.2.2 Limits of minimum-width integer types */ -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST64_MIN INT64_MIN - -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MAX INT64_MAX - -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -/* 7.18.2.3 Limits of fastest minimum-width integer types */ -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST64_MIN INT64_MIN - -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MAX INT64_MAX - -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -/* 7.18.2.4 Limits of integer types capable of holding - object pointers */ -#ifdef _WIN64 -#define INTPTR_MIN INT64_MIN -#define INTPTR_MAX INT64_MAX -#define UINTPTR_MAX UINT64_MAX -#else -#define INTPTR_MIN INT32_MIN -#define INTPTR_MAX INT32_MAX -#define UINTPTR_MAX UINT32_MAX -#endif /* _WIN64 */ - -/* 7.18.2.5 Limits of greatest-width integer types */ -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -/* 7.18.3 Limits of other integer types */ -#define PTRDIFF_MIN INTPTR_MIN -#define PTRDIFF_MAX INTPTR_MAX - -#define SIG_ATOMIC_MIN INTPTR_MIN -#define SIG_ATOMIC_MAX INTPTR_MAX - -/* we need to check for SIZE_MAX already defined because MS defines it in limits.h */ -#ifndef SIZE_MAX -#define SIZE_MAX UINTPTR_MAX -#endif - -#ifndef WCHAR_MIN /* also in wchar.h */ -#define WCHAR_MIN 0 -#define WCHAR_MAX ((wchar_t)-1) /* UINT16_MAX */ -#endif - -/* - * wint_t is unsigned short for compatibility with MS runtime - */ -#define WINT_MIN 0 -#define WINT_MAX ((wint_t)-1) /* UINT16_MAX */ - -#endif /* !defined ( __cplusplus) || defined __STDC_LIMIT_MACROS */ - - -/* 7.18.4 Macros for integer constants */ -#if !defined ( __cplusplus) || defined (__STDC_CONSTANT_MACROS) - -/* 7.18.4.1 Macros for minimum-width integer constants - - Accoding to Douglas Gwyn : - "This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC - 9899:1999 as initially published, the expansion was required - to be an integer constant of precisely matching type, which - is impossible to accomplish for the shorter types on most - platforms, because C99 provides no standard way to designate - an integer constant with width less than that of type int. - TC1 changed this to require just an integer constant - * expression* with *promoted* type." - */ - -#define INT8_C(val) ((int8_t) + (val)) -#define UINT8_C(val) ((uint8_t) + (val ## U)) -#define INT16_C(val) ((int16_t) + (val)) -#define UINT16_C(val) ((uint16_t) + (val ## U)) - -#define INT32_C(val) val ## L -#define UINT32_C(val) val ## UL -#define INT64_C(val) (PASTE( val, __STDINT_LONGLONG_SUFFIX)) -#define UINT64_C(val)(PASTE( PASTE( val, U), __STDINT_LONGLONG_SUFFIX)) - -/* 7.18.4.2 Macros for greatest-width integer constants */ -#define INTMAX_C(val) INT64_C(val) -#define UINTMAX_C(val) UINT64_C(val) - -#endif /* !defined ( __cplusplus) || defined __STDC_CONSTANT_MACROS */ - -#endif diff --git a/include/dds/core/detail/ref_traits.hpp b/include/dds/core/detail/ref_traits.hpp deleted file mode 100644 index 831eac10456..00000000000 --- a/include/dds/core/detail/ref_traits.hpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_DETAIL_REF_TRAITS_HPP_ -#define EPROSIMA_DDS_CORE_DETAIL_REF_TRAITS_HPP_ - -#include //null -#include //InvalidDowncastError - -#include -#include - -namespace dds { -namespace core { - -template< - typename T1, - typename T2> -struct is_base_of : public ::std::is_base_of { }; - -template< - typename T1, - typename T2> -struct is_same : public ::std::is_same { }; - -template -struct smart_ptr_traits -{ - typedef ::std::shared_ptr ref_type; - typedef ::std::weak_ptr weak_ref_type; -}; - -template< - typename TO, - typename FROM> -TO polymorphic_cast( - FROM& from) -{ - - typename TO::DELEGATE_REF_T dr = ::std::dynamic_pointer_cast(from.delegate()); - - TO to(dr); - if (to == null) - { - throw InvalidDowncastError("Attempted invalid downcast."); - } - return to; -} - -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_DETAIL_REF_TRAITS_HPP_ diff --git a/include/dds/core/macros.hpp b/include/dds/core/macros.hpp deleted file mode 100644 index d8065397f6b..00000000000 --- a/include/dds/core/macros.hpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_MACROS_HPP_ -#define OMG_DDS_CORE_MACROS_HPP_ - -#include - -// == Static Assert ========================================================= -#define OMG_DDS_STATIC_ASSERT OMG_DDS_STATIC_ASSERT_DETAIL -// ========================================================================== - - -// == Logging Macros ======================================================== -#define OMG_DDS_LOG(kind, msg) OMG_DDS_LOG_DETAIL(kind, msg) -// ========================================================================== - - -// == State Width Constants ================================================= -/* By default, there can be up to 32 unique statuses. However, a - * DDS implementation may extend this number if necessary. - */ -#define OMG_DDS_DEFAULT_STATE_BIT_COUNT OMG_DDS_DEFAULT_STATE_BIT_COUNT_DETAIL -#define OMG_DDS_DEFAULT_STATUS_COUNT OMG_DDS_DEFAULT_STATUS_COUNT_DETAIL - -#ifndef OMG_DDS_STATE_BIT_COUNT -#define OMG_DDS_STATE_BIT_COUNT OMG_DDS_DEFAULT_STATE_BIT_COUNT -#endif // !defined(OMG_DDS_STATE_BIT_COUNT) - -#ifndef OMG_DDS_STATUS_COUNT -#define OMG_DDS_STATUS_COUNT OMG_DDS_DEFAULT_STATUS_COUNT -#endif // !defined(OMG_DDS_STATUS_COUNT) -// ========================================================================== - - -// == DLL Export Macros ===================================================== -#define OMG_DDS_API OMG_DDS_API_DETAIL -// ========================================================================== - -#endif //OMG_DDS_CORE_MACROS_HPP_ diff --git a/include/dds/core/policy/CorePolicy.hpp b/include/dds/core/policy/CorePolicy.hpp deleted file mode 100644 index c21dd817aa8..00000000000 --- a/include/dds/core/policy/CorePolicy.hpp +++ /dev/null @@ -1,1705 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_POLICY_CORE_POLICY_HPP_ -#define OMG_DDS_CORE_POLICY_CORE_POLICY_HPP_ - -#include -#include -#include - -#include -#include -#include -#include -#include - -//============================================================================== -// MACROS -// *INDENT-OFF* -#define OMG_DDS_POLICY_TRAITS(POLICY, ID) \ - template<> \ - class policy_id { \ - public: \ - static const dds::core::policy::QosPolicyId value = ID; \ - }; \ - template<> \ - class policy_name { \ - public: \ - static const std::string& name(); \ - }; - -#define OMG_DDS_DEFINE_POLICY_TRAITS(POLICY, NAME) \ - const std::string& dds::core::policy::policy_name::name() { \ - static std::string name = #NAME; \ - return name; \ - } -// *INDENT-OFF* - - -namespace dds { -namespace core { -namespace policy { - -//============================================================================== -/** - * \copydoc DCPS_QoS_UserData - */ -class UserData : public dds::core::Value -{ -public: - - /** - * Creates a UserData QoS instance with an empty UserData - */ - UserData(); - - /** - * Creates a UserData QoS instance - * - * @param sequence the sequence of octets - */ - explicit UserData( - const dds::core::ByteSeq& sequence); - - /** - * Creates a UserData QoS instance - * - * @param value_begin a pointer to the beginning of a sequence - * of octets - * @param value_end a pointer to the end of a sequence - * of octets - */ - UserData( - const uint8_t* value_begin, - const uint8_t* value_end); - - /** - * Copies a UserData QoS instance - * - * @param other the UserData QoS instance to copy - */ - UserData( - const UserData& other); - - /** - * Sets the sequence - * - * @param sequence a sequence of octets - */ - UserData& value( - const dds::core::ByteSeq& sequence); - - /** - * Sets the sequence - * - * @param begin an iterator pointing to the beginning of a sequence - * of octets - * @param end an iterator pointing to the end of a sequence of octets - */ - template - UserData& value( - OCTET_ITER begin, - OCTET_ITER end); - - /** - * Gets the sequence - * - * @return a sequence of octets - */ - const dds::core::ByteSeq value() const; - - /** - * Gets a pointer to the first octet in the sequence - * - * @return a pointer to the first octet in the sequence - */ - const uint8_t* begin() const; - - /** - * Gets a pointer to the last octet in the sequence - * - * @return a pointer to the first octet in the sequence - */ - const uint8_t* end() const; -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_GroupData - */ -class GroupData : public dds::core::Value -{ -public: - - /** - * Creates a GroupData QoS instance - */ - GroupData(); - - /** - * Creates a GroupData QoS instance - * - * @param sequence the sequence of octets representing the GroupData - */ - explicit GroupData( - const dds::core::ByteSeq& sequence); - - /** - * Copies a GroupData QoS instance - * - * @param other the GroupData QoS instance to copy - */ - GroupData( - const GroupData& other); - - /** - * Creates a GroupData QoS instance - * - * @param value_begin a pointer to the beginning of a sequence - * of octets - * @param value_end a pointer to the end of a sequence - * of octets - */ - GroupData( - const uint8_t* value_begin, - const uint8_t* value_end); - - /** - * Set the sequence - * - * @param sequence a sequence of octets - */ - GroupData& value( - const dds::core::ByteSeq& sequence); - - /** - * Set the sequence - * - * @param begin an iterator pointing to the beginning of a sequence - * of octets - * @param end an iterator pointing to the end of a sequence of octets - */ - template - GroupData& value( - OCTET_ITER begin, - OCTET_ITER end); - - /** - * Get the sequence - * - * @return a sequence of octets - */ - const dds::core::ByteSeq value() const; - - /** - * Gets a pointer to the first octet in the sequence - * - * @return a pointer to the first octet in the sequence - */ - const uint8_t* begin() const; - - /** - * Gets a pointer to the last octet in the sequence - * - * @return a pointer to the last octet in the sequence - */ - const uint8_t* end() const; -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_TopicData - */ -class TopicData : public dds::core::Value -{ -public: - - /** - * Creates a TopicData QoS instance - */ - TopicData(); - - /** - * Creates a TopicData QoS instance - * - * @param sequence the sequence of octets representing the TopicData - */ - explicit TopicData( - const dds::core::ByteSeq& sequence); - - /** - * Copies a TopicData QoS instance - * - * @param other the TopicData QoS instance to copy - */ - TopicData( - const TopicData& other); - - /** - * Creates a TopicData QoS instance - * - * @param value_begin a pointer to the beginning of a sequence - * of octets - * @param value_end a pointer to the end of a sequence - * of octets - */ - TopicData( - const uint8_t* value_begin, - const uint8_t* value_end); - - /** - * Set the sequence - * - * @param sequence a sequence of octets - */ - TopicData& value( - const dds::core::ByteSeq& sequence); - - /** - * Set the sequence - * - * @param begin an iterator pointing to the beginning of a sequence - * of octets - * @param end an iterator pointing to the end of a sequence of octets - */ - template - TopicData& value( - OCTET_ITER begin, - OCTET_ITER end); - - /** - * Get the sequence - * - * @return a sequence of octets - */ - const dds::core::ByteSeq value() const; - - /** - * Gets a pointer to the first octet in the sequence - * - * @return a pointer to the first octet in the sequence - */ - const uint8_t* begin() const; - - /** - * Gets a pointer to the last octet in the sequence - * - * @return a pointer to the last octet in the sequence - */ - const uint8_t* end() const; -}; - - -//============================================================================== - -/** - * \copydoc DCPS_QoS_EntityFactory - */ -class EntityFactory : public dds::core::Value -{ -public: - - /** - * Creates an EntityFactory QoS instance - * - * @param autoenable_created_entities boolean indicating whether - * created Entities should be automatically enabled - */ - explicit EntityFactory( - bool autoenable_created_entities = true); - - /** - * Copies an EntityFactory QoS instance - * - * @param other the EntityFactory QoS instance to copy - */ - EntityFactory( - const EntityFactory& other); - - /** - * Sets a boolean indicating whether created Entities should be - * automatically enabled - * - * @param autoenable_created_entities boolean indicating whether - * created Entities should be automatically enabled - */ - EntityFactory& autoenable_created_entities( - bool autoenable_created_entities); - - /** - * Gets a boolean indicating whether Entities should be automatically enabled - * - * @return boolean indicating whether created Entities should be automatically - * enabled - */ - bool autoenable_created_entities() const; - - /** - * @return an EntityFactory QoS instance with autoenable_created_entities - * set to true - */ - static EntityFactory AutoEnable(); - - /** - * @return an EntityFactory QoS instance with autoenable_created_entities - * set to false - */ - static EntityFactory ManuallyEnable(); -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_TransportPriority - */ -class TransportPriority : public dds::core::Value -{ -public: - - /** - * Creates a TransportPriority QoS instance - * - * @param priority the priority value - */ - explicit TransportPriority( - int32_t priority = 0); - - /** - * Copies a TransportPriority QoS instance - * - * @param other the TransportPriority QoS instance to copy - */ - TransportPriority( - const TransportPriority& other); - - /** - * Sets the priority value - * - * @param priority the priority value - */ - TransportPriority& value( - int32_t priority); - - /** - * Gets the priority value - * - * @return the priority value - */ - int32_t value() const; -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_Lifespan - */ -class Lifespan : public dds::core::Value -{ -public: - - /** - * Creates a Lifespan QoS instance - * - * @param duration Lifespan expiration duration - */ - explicit Lifespan( - const dds::core::Duration& duration = dds::core::Duration::infinite()); - - /** - * Copies a Lifespan QoS instance - * - * @param other the Lifespan QoS instance to copy - */ - Lifespan( - const Lifespan& other); - - /** - * Sets the expiration duration - * - * @param duration expiration duration - */ - Lifespan& duration( - const dds::core::Duration& duration); - - /** - * Gets the expiration duration - * - * @return expiration duration - */ - const dds::core::Duration duration() const; -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_Deadline - */ -class Deadline : public dds::core::Value -{ -public: - - /** - * Creates a Deadline QoS instance - * - * @param period deadline period - */ - explicit Deadline( - const dds::core::Duration& period = dds::core::Duration::infinite()); - - /** - * Copies a Deadline QoS instance - * - * @param other the Deadline QoS instance to copy - */ - Deadline( - const Deadline& other); - - /** - * Sets the deadline period - * - * @param period deadline period - */ - Deadline& period( - const dds::core::Duration& period); - - /** - * Gets the deadline period - * - * @return deadline period - */ - const dds::core::Duration period() const; -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_LatencyBudget - */ -class LatencyBudget : public dds::core::Value -{ -public: - - /** - * Creates a LatencyBudget QoS instance - * - * @param duration duration - */ - explicit LatencyBudget( - const dds::core::Duration& duration = dds::core::Duration::zero()); - - /** - * Copies a LatencyBudget QoS instance - * - * @param other the LatencyBudget QoS instance to copy - */ - LatencyBudget( - const LatencyBudget& other); - - /** - * Sets the duration - * - * @param duration duration - */ - LatencyBudget& duration( - const dds::core::Duration& duration); - - /** - * Gets the duration - * - * @return duration - */ - const dds::core::Duration duration() const; -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_TimeBasedFilter - */ -class TimeBasedFilter : public dds::core::Value -{ -public: - - /** - * Creates a TimeBasedFilter QoS instance - * - * @param period minimum separation period - */ - explicit TimeBasedFilter( - const dds::core::Duration& period = dds::core::Duration::zero()); - - /** - * Copies a TimeBasedFilter QoS instance - * - * @param other the TimeBasedFilter QoS instance to copy - */ - TimeBasedFilter( - const TimeBasedFilter& other); - - /** - * Sets the minimum separation period - * - * @param period minimum separation period - */ - TimeBasedFilter& minimum_separation( - const dds::core::Duration& period); - - /** - * Gets the minimum separation period - * - * @return minimum separation period - */ - const dds::core::Duration minimum_separation() const; -}; - - -//============================================================================== - -/** - * \copydoc DCPS_QoS_Partition - */ -class Partition : public dds::core::Value -{ -public: - - Partition(); - - /** - * Creates a Partition QoS instance - * - * @param in_length partition length - */ - explicit Partition( - uint16_t in_length); - - /** - * Copies a Partition QoS instance - * - * @param other the Partition QoS instance to copy - */ - Partition( - const Partition& other); - - /** - * Sets the partition name - * - * @param name the partition name - */ - Partition& name( - const std::string& name); - - /** - * Sets multiple partition names - * - * @param names a sequence containing multiple partition names - */ - Partition& names( - dds::core::StringSeq& names); - - /** - * Gets the partition names - * - * @return a sequence containing the partition names - */ - const dds::core::StringSeq names() const; - - /** - * Appends a name to the list of partition names. - * @param name Name to append. - */ - void push_back( - const char* name); - - void clear(); -}; - -//============================================================================== -//#ifdef OMG_DDS_OWNERSHIP_SUPPORT - -/** - * \copydoc DCPS_QoS_Ownership - */ -class Ownership : public dds::core::Value -{ -public: - - # if defined (__SUNPRO_CC) && defined(SHARED) - # undef SHARED - # endif // if defined (__SUNPRO_CC) && defined(SHARED) - /** - * Creates an Ownership QoS instance - * - * @param kind the kind - */ - explicit Ownership( - dds::core::policy::OwnershipKind::Type kind = dds::core::policy::OwnershipKind::SHARED); - - /** - * Copies an Ownership QoS instance - * - * @param other the Ownership QoS instance to copy - */ - Ownership( - const Ownership& other); - - /** - * Set the kind - * - * @param kind the kind - */ - Ownership& kind( - dds::core::policy::OwnershipKind::Type kind); - - /** - * Get the kind - * - * @param kind the kind - */ - dds::core::policy::OwnershipKind::Type kind() const; - - /** - * @return an Ownership QoS instance with the kind set to EXCLUSIVE - */ - static Ownership Exclusive(); - - /** - * @return an Ownership QoS instance with the kind set to SHARED - */ - static Ownership Shared(); - -private: - - static eprosima::fastdds::dds::OwnershipQosPolicyKind to_native( - OwnershipKind::Type kind); - - static OwnershipKind::Type from_native( - eprosima::fastdds::dds::OwnershipQosPolicyKind kind); -}; - - -//============================================================================== - -/** - * \copydoc DCPS_QoS_OwnershipStrength - */ -class OwnershipStrength : public dds::core::Value -{ -public: - - /** - * Creates an OwnershipStrength QoS instance - * - * @param strength ownership strength - */ - explicit OwnershipStrength( - int32_t strength = 0); - - /** - * Copies an OwnershipStrength QoS instance - * - * @param other the OwnershipStrength QoS instance to copy - */ - OwnershipStrength( - const OwnershipStrength& other); - - /** - * Gets the ownership strength value - * - * @return the ownership strength value - */ - int32_t value() const; - - /** - * Sets the ownership strength value - * - * @param strength the ownership strength value - */ - OwnershipStrength& value( - int32_t strength); -}; - -//#endif // OMG_DDS_OWNERSHIP_SUPPORT -//============================================================================== - -/** - * \copydoc DCPS_QoS_WriterDataLifecycle - */ -class WriterDataLifecycle : public dds::core::Value -{ -public: - - /** - * Creates a WriterDataLifecycle QoS instance - * - * @param autodispose_unregistered_instances Specifies the behavior of the DataWriter - * with regards to the lifecycle of the data-instances it manages. - */ - explicit WriterDataLifecycle( - bool autodispose_unregistered_instances = true); - - /** - * Copies a WriterDataLifecycle QoS instance - * - * @param other the WriterDataLifecycle QoS instance to copy - */ - WriterDataLifecycle( - const WriterDataLifecycle& other); - - /** - * Gets a boolean indicating if unregistered instances should be autodisposed - * - * @return a boolean indicating if unregistered instances should be autodisposed - */ - bool autodispose_unregistered_instances() const; - - /** - * Sets a boolean indicating if unregistered instances should be autodisposed - * - * @param autodispose_unregistered_instances a boolean indicating if unregistered - * instances should be autodisposed - */ - WriterDataLifecycle& autodispose_unregistered_instances( - bool autodispose_unregistered_instances); - - /** - * @return a WriterDataLifecycle QoS instance with autodispose_unregistered_instances - * set to true - */ - static WriterDataLifecycle AutoDisposeUnregisteredInstances(); - - /** - * @return a WriterDataLifecycle QoS instance with autodispose_unregistered_instances - * set to false - */ - static WriterDataLifecycle ManuallyDisposeUnregisteredInstances(); - -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_ReaderDataLifecycle - */ -class ReaderDataLifecycle : public dds::core::Value -{ -public: - - /** - * Creates a ReaderDataLifecycle QoS instance - * - * @param autopurge_nowriter_samples_delay the autopurge nowriter samples delay - * @param autopurge_disposed_samples_delay the autopurge disposed samples delay - */ - ReaderDataLifecycle( - const dds::core::Duration& autopurge_nowriter_samples_delay = dds::core::Duration::infinite(), - const dds::core::Duration& autopurge_disposed_samples_delay = dds::core::Duration::infinite()); - - /** - * Copies a ReaderDataLifecycle QoS instance - * - * @param other the ReaderDataLifecycle QoS instance to copy - */ - ReaderDataLifecycle( - const ReaderDataLifecycle& other); - /** - * Gets the autopurge nowriter samples delay - * - * @return the autopurge nowriter samples delay - */ - const dds::core::Duration autopurge_nowriter_samples_delay() const; - - /** - * Sets the autopurge nowriter samples delay - * - * @param autopurge_nowriter_samples_delay the autopurge nowriter samples delay - */ - ReaderDataLifecycle& autopurge_nowriter_samples_delay( - const dds::core::Duration& autopurge_nowriter_samples_delay); - - /** - * Gets the autopurge_disposed_samples_delay - * - * @return the autopurge disposed samples delay - */ - const dds::core::Duration autopurge_disposed_samples_delay() const; - - /** - * Sets the autopurge_disposed_samples_delay - * - * @return the autopurge disposed samples delay - */ - ReaderDataLifecycle& autopurge_disposed_samples_delay( - const dds::core::Duration& autopurge_disposed_samples_delay); - - /** - * @return a ReaderDataLifecycle QoS instance which will not autopurge disposed - * samples - */ - static ReaderDataLifecycle NoAutoPurgeDisposedSamples(); - - /** - * @param autopurge_disposed_samples_delay the autopurge disposed samples delay - * @return a ReaderDataLifecycle QoS instance with autopurge_disposed_samples_delay - * set to a specified value - */ - static ReaderDataLifecycle AutoPurgeDisposedSamples( - const dds::core::Duration& autopurge_disposed_samples_delay); - -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_Durability - */ -class Durability : public dds::core::Value -{ -public: - - /** - * Creates a Durability QoS instance - * - * @param kind the kind - */ - explicit Durability( - dds::core::policy::DurabilityKind::Type kind = dds::core::policy::DurabilityKind::VOLATILE); - - /** - * Copies a Durability QoS instance - * - * @param other the Durability QoS instance to copy - */ - Durability( - const Durability& other); - - /** - * Set the kind - * - * @param kind the kind - */ - Durability& kind( - dds::core::policy::DurabilityKind::Type kind); - - /** - * Get the kind - * - * @param kind the kind - */ - dds::core::policy::DurabilityKind::Type kind() const; - - /** - * @return a Durability QoS instance with the kind set to VOLATILE - */ - static Durability Volatile(); - - /** - * @return a Durability QoS instance with the kind set to TRANSIENT_LOCAL - */ - static Durability TransientLocal(); - - /** - * @return a Durability QoS instance with the kind set to TRANSIENT - */ - static Durability Transient(); - - /** - * @return a Durability QoS instance with the kind set to PERSISTENT - */ - static Durability Persistent(); - -private: - - static eprosima::fastdds::dds::DurabilityQosPolicyKind to_native( - DurabilityKind::Type kind); - - static DurabilityKind::Type from_native( - eprosima::fastdds::dds::DurabilityQosPolicyKind kind); - -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_Presentation - */ -class Presentation : public dds::core::Value -{ -public: - - /** - * Creates a Presentation QoS instance - * - * @param access_scope the access_scope kind - * @param coherent_access the coherent_access setting - * @param ordered_access the ordered_access setting - */ - Presentation( - dds::core::policy::PresentationAccessScopeKind::Type access_scope = - dds::core::policy::PresentationAccessScopeKind::INSTANCE, - bool coherent_access = false, - bool ordered_access = false); - - /** - * Copies a Presentation QoS instance - * - * @param other the Presentation QoS instance to copy - */ - Presentation( - const Presentation& other); - - /** - * Sets the access_scope kind - * - * @param access_scope the access_scope kind - */ - Presentation& access_scope( - dds::core::policy::PresentationAccessScopeKind::Type access_scope); - - /** - * Gets the access_scope kind - * - * @return the access_scope kind - */ - dds::core::policy::PresentationAccessScopeKind::Type access_scope() const; - - /** - * Sets the coherent_access setting - * - * @param coherent_access the coherent_access setting - */ - Presentation& coherent_access( - bool coherent_access); - - /** - * Gets the coherent_access setting - * - * @return the coherent_access setting - */ - bool coherent_access() const; - - /** - * Sets the ordered_access setting - * - * @param ordered_access the ordered_access setting - */ - Presentation& ordered_access( - bool ordered_access); - - /** - * Gets the ordered_access setting - * - * @return the ordered_access setting - */ - bool ordered_access() const; - - /** - * @param coherent_access the coherent_access setting - * @param ordered_access the ordered_access setting - * - * @return a Presentation QoS instance with a GROUP access_score and coherent_access - * and ordered_access set to the specified values - */ - static Presentation GroupAccessScope( - bool coherent_access = false, - bool ordered_access = false); - - /** - * @param coherent_access the coherent_access setting - * @param ordered_access the ordered_access setting - * - * @return a Presentation QoS instance with a INSTANCE access_score and coherent_access - * and ordered_access set to the specified values - */ - static Presentation InstanceAccessScope( - bool coherent_access = false, - bool ordered_access = false); - - /** - * @param coherent_access the coherent_access setting - * @param ordered_access the ordered_access setting - * - * @return a Presentation QoS instance with a TOPIC access_score and coherent_access - * and ordered_access set to the specified values - */ - static Presentation TopicAccessScope( - bool coherent_access = false, - bool ordered_access = false); - -private: - - static eprosima::fastdds::dds::PresentationQosPolicyAccessScopeKind to_native( - PresentationAccessScopeKind::Type kind); - - static PresentationAccessScopeKind::Type from_native( - eprosima::fastdds::dds::PresentationQosPolicyAccessScopeKind kind); -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_Reliability - */ -class Reliability : public dds::core::Value -{ -public: - - /** - * Creates a Reliability QoS instance - * - * @param kind the kind - * @param max_blocking_time the max_blocking_time - */ - Reliability( - dds::core::policy::ReliabilityKind::Type kind = dds::core::policy::ReliabilityKind::BEST_EFFORT, - const dds::core::Duration& max_blocking_time = dds::core::Duration::from_millisecs(100)); - - /** - * Copies a Reliability QoS instance - * - * @param other the Reliability QoS instance to copy - */ - Reliability( - const Reliability& other); - - /** - * Sets the kind - * - * @param kind the kind - */ - Reliability& kind( - dds::core::policy::ReliabilityKind::Type kind); - - /** - * Gets the kind - * - * @return the kind - */ - dds::core::policy::ReliabilityKind::Type kind() const; - - /** - * Sets the max_blocking_time - * - * @param max_blocking_time the max_blocking_time - */ - Reliability& max_blocking_time( - const dds::core::Duration& max_blocking_time); - - /** - * Gets the max_blocking_time - * - * @return the max_blocking_time - */ - const dds::core::Duration max_blocking_time() const; - - /** - * @param the max_blocking_time - * @return a Reliability QoS instance with the kind set to RELIABLE and the max_blocking_time - * set to the supplied value - */ - static OMG_DDS_API Reliability Reliable( - const dds::core::Duration& max_blocking_time = dds::core::Duration::from_millisecs(100)); - - /** - * @return a Reliability QoS instance with the kind set to BEST_EFFORT - */ - static Reliability BestEffort( - const dds::core::Duration& max_blocking_time = dds::core::Duration::from_millisecs(100)); - -private: - - static ReliabilityKind::Type from_native( - eprosima::fastdds::dds::ReliabilityQosPolicyKind kind); - - static eprosima::fastdds::dds::ReliabilityQosPolicyKind to_native( - ReliabilityKind::Type kind); - -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_DestinationOrder - */ -class DestinationOrder : public dds::core::Value -{ -public: - - /** - * Creates a DestinationOrder QoS instance - * - * @param kind the kind - */ - explicit DestinationOrder( - dds::core::policy::DestinationOrderKind::Type kind = - dds::core::policy::DestinationOrderKind::BY_RECEPTION_TIMESTAMP); - - /** - * Copies a DestinationOrder QoS instance - * - * @param other the Reliability QoS instance to copy - */ - DestinationOrder( - const DestinationOrder& other); - - /** - * Sets the kind - * - * @param kind the kind - */ - DestinationOrder& kind( - dds::core::policy::DestinationOrderKind::Type kind); - - /** - * Gets the kind - * - * @return the kind - */ - dds::core::policy::DestinationOrderKind::Type kind() const; - - /** - * @return a DestinationOrder QoS instance with the kind set to BY_SOURCE_TIMESTAMP - */ - static DestinationOrder SourceTimestamp(); - - /** - * @return a DestinationOrder QoS instance with the kind set to BY_RECEPTION_TIMESTAMP - */ - static DestinationOrder ReceptionTimestamp(); - -private: - - static eprosima::fastdds::dds::DestinationOrderQosPolicyKind to_native( - DestinationOrderKind::Type kind); - - static DestinationOrderKind::Type from_native( - eprosima::fastdds::dds::DestinationOrderQosPolicyKind kind); - -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_History - */ -class History : public dds::core::Value -{ -public: - - /** - * Creates a History QoS instance - * - * @param kind the kind - * @param depth the history depth - */ - History( - dds::core::policy::HistoryKind::Type kind = dds::core::policy::HistoryKind::KEEP_LAST, - int32_t depth = 1); - - /** - * Copies a History QoS instance - * - * @param other the History QoS instance to copy - */ - History( - const History& other); - - /** - * Gets the kind - * - * @return the kind - */ - dds::core::policy::HistoryKind::Type kind() const; - - /** - * Sets the kind - * - * @param kind the kind - */ - History& kind( - dds::core::policy::HistoryKind::Type kind); - - /** - * Gets the history depth - * - * @return the history depth - */ - int32_t depth() const; - - /** - * Sets the history depth - * - * @param the history depth - */ - History& depth( - int32_t depth); - - /** - * @return a History QoS instance with the kind set to KEEP_ALL - */ - static History KeepAll(); - - /** - * @param depth the history depth - * @return a History QoS instance with the kind set to KEEP_LAST and the - * depth set to the supplied value - */ - static History KeepLast( - uint32_t depth); - -private: - - friend class DurabilityService; - - static eprosima::fastdds::dds::HistoryQosPolicyKind to_native( - HistoryKind::Type kind); - - static HistoryKind::Type from_native( - eprosima::fastdds::dds::HistoryQosPolicyKind kind); - -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_ResourceLimits - */ -class ResourceLimits : public dds::core::Value -{ -public: - - /** - * Creates a ResourceLimits QoS instance - * - * @param max_samples the max_samples value - * @param max_instances the max_instances value - * @param max_samples_per_instance the max_samples_per_instance value - */ - ResourceLimits( - uint32_t max_samples = dds::core::LENGTH_UNLIMITED, - uint32_t max_instances = dds::core::LENGTH_UNLIMITED, - uint32_t max_samples_per_instance = dds::core::LENGTH_UNLIMITED); - - /** - * Copies a ResourceLimits QoS instance - * - * @param other the ResourceLimits QoS instance to copy - */ - ResourceLimits( - const ResourceLimits& other); - -public: - - /** - * Sets the max_samples value - * - * @param max_samples the max_samples value - */ - ResourceLimits& max_samples( - int32_t max_samples); - - /** - * Gets the max_samples value - * - * @return the max_samples value - */ - int32_t max_samples() const; - - /** - * Sets the max_instances value - * - * @param max_instances the max_instances value - */ - ResourceLimits& max_instances( - int32_t max_instances); - - /** - * Gets the max_instances value - * - * @return the max_instances value - */ - int32_t max_instances() const; - - /** - * Sets the max_samples_per_instance value - * - * @param max_samples_per_instance the max_samples_per_instance value - */ - ResourceLimits& max_samples_per_instance( - int32_t max_samples_per_instance); - - /** - * Gets the max_samples_per_instance value - * - * @return the max_samples_per_instance value - */ - int32_t max_samples_per_instance() const; -}; - -//============================================================================== - -/** - * \copydoc DCPS_QoS_Liveliness - */ -class Liveliness : public dds::core::Value -{ -public: - - /** - * Creates a Liveliness QoS instance - * - * @param kind the kind - * @param lease_duration the lease_duration - */ - Liveliness( - dds::core::policy::LivelinessKind::Type kind = dds::core::policy::LivelinessKind::AUTOMATIC, - const dds::core::Duration& lease_duration = dds::core::Duration::infinite()); - - /** - * Copies a Liveliness QoS instance - * - * @param other the Liveliness QoS instance to copy - */ - Liveliness( - const Liveliness& other); - - /** - * Sets the kind - * - * @param kind the kind - */ - Liveliness& kind( - dds::core::policy::LivelinessKind::Type kind); - - /** - * Gets the kind - * - * @return the kind - */ - dds::core::policy::LivelinessKind::Type kind() const; - - /** - * Sets the lease_duration - * - * @return the lease_duration - */ - Liveliness& lease_duration( - const dds::core::Duration& lease_duration); - - /** - * Gets the lease_duration - * - * @return the lease_duration - */ - const dds::core::Duration lease_duration() const; - - /** - * @return a Liveliness QoS instance with the kind set to AUTOMATIC - */ - static Liveliness Automatic(); - - /** - * @return a Liveliness QoS instance with the kind set to MANUAL_BY_PARTICIPANT - * and the lease_duration set to the supplied value - */ - static Liveliness ManualByParticipant( - const dds::core::Duration& lease_duration = dds::core::Duration::infinite()); - - /** - * @return a Liveliness QoS instance with the kind set to MANUAL_BY_TOPIC - * and the lease_duration set to the supplied value - */ - static Liveliness ManualByTopic( - const dds::core::Duration& lease_duration = dds::core::Duration::infinite()); - -private: - - static eprosima::fastdds::dds::LivelinessQosPolicyKind to_native( - LivelinessKind::Type kind); - - static LivelinessKind::Type from_native( - eprosima::fastdds::dds::LivelinessQosPolicyKind kind); - -}; - - -//============================================================================== -//#ifdef OMG_DDS_PERSISTENCE_SUPPORT - -/** - * \copydoc DCPS_QoS_DurabilityService - */ -class DurabilityService : public dds::core::Value -{ -public: - - /** - * Creates a DurabilityService QoS instance - * - * @param service_cleanup_delay the service_cleanup_delay - * @param history_kind the history_kind value - * @param history_depth the history_depth value - * @param max_samples the max_samples value - * @param max_instances the max_instances value - * @param max_samples_per_instance the max_samples_per_instance value - */ - DurabilityService( - const dds::core::Duration& service_cleanup_delay = dds::core::Duration::zero(), - dds::core::policy::HistoryKind::Type history_kind = dds::core::policy::HistoryKind::KEEP_LAST, - int32_t history_depth = 1, - int32_t max_samples = dds::core::LENGTH_UNLIMITED, - int32_t max_instances = dds::core::LENGTH_UNLIMITED, - int32_t max_samples_per_instance = dds::core::LENGTH_UNLIMITED); - - /** - * Copies a DurabilityService QoS instance - * - * @param other the DurabilityService QoS instance to copy - */ - DurabilityService( - const DurabilityService& other); - - /** - * Sets the service_cleanup_delay value - * - * @param service_cleanup_delay the service_cleanup_delay value - */ - DurabilityService& service_cleanup_delay( - const dds::core::Duration& service_cleanup_delay); - - /** - * Gets the service_cleanup_delay value - * - * @return the service_cleanup_delay - */ - const dds::core::Duration service_cleanup_delay() const; - - /** - * Sets the history_kind - * - * @param the history_kind - */ - DurabilityService& history_kind( - dds::core::policy::HistoryKind::Type history_kind); - - /** - * Gets the history_kind - * - * @return history_kind - */ - dds::core::policy::HistoryKind::Type history_kind() const; - - /** - * Sets the history_depth value - * - * @param history_depth the history_depth value - */ - DurabilityService& history_depth( - int32_t history_depth); - - /** - * Gets the history_depth value - * - * @return history_depth - */ - int32_t history_depth() const; - - /** - * Sets the max_samples value - * - * @param max_samples the max_samples value - */ - DurabilityService& max_samples( - int32_t max_samples); - - /** - * Gets the max_samples value - * - * @return the max_samples value - */ - int32_t max_samples() const; - - /** - * Sets the max_instances value - * - * @param max_instances the max_instances value - */ - DurabilityService& max_instances( - int32_t max_instances); - - /** Gets the max_instances value - * - * @return the max_instances value - */ - int32_t max_instances() const; - - /** - * Sets the max_samples_per_instance value - * - * @param max_samples_per_instance the max_samples_per_instance value - */ - DurabilityService& max_samples_per_instance( - int32_t max_samples_per_instance); - - /** - * Gets the max_samples_per_instance value - * - * @return the max_samples_per_instance value - */ - int32_t max_samples_per_instance() const; -}; - -//#endif //OMG_DDS_PERSISTENCE_SUPPORT - -//============================================================================== - -//#ifdef OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT - -typedef uint16_t DataRepresentationId; - -typedef std::vector DataRepresentationIdSeq; - -class DataRepresentation : public dds::core::Value -{ - -public: - - explicit DataRepresentation( - const dds::core::policy::DataRepresentationIdSeq& value); - - DataRepresentation( - const DataRepresentation& other) - : dds::core::Value(other) - { - } - - DataRepresentation& value( - const dds::core::policy::DataRepresentationIdSeq& value); - - const dds::core::policy::DataRepresentationIdSeq value() const; - - dds::core::policy::DataRepresentationIdSeq& value(); - -private: - - static std::vector to_native( - const DataRepresentationIdSeq& seq); - -}; - -//#endif //OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT - - -//============================================================================ - -//#ifdef OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT - -class TypeConsistencyEnforcement : public dds::core::Value -{ -public: - - explicit TypeConsistencyEnforcement( - dds::core::policy::TypeConsistencyEnforcementKind::Type kind); - - TypeConsistencyEnforcement& kind( - dds::core::policy::TypeConsistencyEnforcementKind::Type kind); - - dds::core::policy::TypeConsistencyEnforcementKind::Type kind() const; - - TypeConsistencyEnforcement& ignore_sequence_bounds( - bool ignore_sequence_bounds); - - TypeConsistencyEnforcement& ignore_string_bounds( - bool ignore_string_bounds); - - TypeConsistencyEnforcement& ignore_member_names( - bool ignore_member_names); - - TypeConsistencyEnforcement& prevent_type_widening( - bool prevent_type_widening); - - TypeConsistencyEnforcement& force_type_validation( - bool force_type_validation); - - bool ignore_sequence_bounds(); - - bool ignore_string_bounds(); - - bool ignore_member_names(); - - bool prevent_type_widening(); - - bool force_type_validation(); - -}; - -//#endif //OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT - -//============================================================================== -// Policy Trait Classes - -template -class policy_id; - -template -class policy_name; - -#ifdef OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT -/** @todo - Known issue. */ -#endif // ifdef OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT - -OMG_DDS_POLICY_TRAITS(UserData, eprosima::fastdds::dds::USERDATA_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(Durability, eprosima::fastdds::dds::DURABILITY_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(Presentation, eprosima::fastdds::dds::PRESENTATION_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(Deadline, eprosima::fastdds::dds::DEADLINE_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(LatencyBudget, eprosima::fastdds::dds::LATENCYBUDGET_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(Ownership, eprosima::fastdds::dds::OWNERSHIP_QOS_POLICY_ID) - -//#ifdef OMG_DDS_OWNERSHIP_SUPPORT -OMG_DDS_POLICY_TRAITS(OwnershipStrength, eprosima::fastdds::dds::OWNERSHIPSTRENGTH_QOS_POLICY_ID) -//#endif //OMG_DDS_OWNERSHIP_SUPPORT - -OMG_DDS_POLICY_TRAITS(Liveliness, eprosima::fastdds::dds::LIVELINESS_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(TimeBasedFilter, eprosima::fastdds::dds::TIMEBASEDFILTER_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(Partition, eprosima::fastdds::dds::PARTITION_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(Reliability, eprosima::fastdds::dds::RELIABILITY_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(DestinationOrder, eprosima::fastdds::dds::DESTINATIONORDER_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(History, eprosima::fastdds::dds::HISTORY_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(ResourceLimits, eprosima::fastdds::dds::RESOURCELIMITS_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(EntityFactory, eprosima::fastdds::dds::ENTITYFACTORY_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(WriterDataLifecycle, eprosima::fastdds::dds::WRITERDATALIFECYCLE_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(ReaderDataLifecycle, eprosima::fastdds::dds::READERDATALIFECYCLE_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(TopicData, eprosima::fastdds::dds::TOPICDATA_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(GroupData, eprosima::fastdds::dds::GROUPDATA_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(TransportPriority, eprosima::fastdds::dds::TRANSPORTPRIORITY_QOS_POLICY_ID) -OMG_DDS_POLICY_TRAITS(Lifespan, eprosima::fastdds::dds::LIFESPAN_QOS_POLICY_ID) - -//#ifdef OMG_DDS_PERSISTENCE_SUPPORT -OMG_DDS_POLICY_TRAITS(DurabilityService, eprosima::fastdds::dds::DURABILITYSERVICE_QOS_POLICY_ID) -//#endif //OMG_DDS_PERSISTENCE_SUPPORT - -} //namespace policy -} //namespace core -} //namespace dds - - -#endif //OMG_DDS_CORE_POLICY_CORE_POLICY_HPP_ diff --git a/include/dds/core/policy/PolicyKind.hpp b/include/dds/core/policy/PolicyKind.hpp deleted file mode 100644 index d09d312adc9..00000000000 --- a/include/dds/core/policy/PolicyKind.hpp +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_POLICY_POLICYKIND_HPP_ -#define OMG_DDS_CORE_POLICY_POLICYKIND_HPP_ - -#include -#include - -#include - -namespace dds { -namespace core { -namespace policy { - -#if defined (__SUNPRO_CC) && defined(SHARED) -#undef SHARED -#endif -struct OwnershipKind_def -{ - enum Type - { - SHARED /**< The same instance can be written by - * multiple DataWriter objects. All updates will be made available to the - * DataReader objects. In other words it does not have a specific owner. - */ - #ifdef OMG_DDS_OWNERSHIP_SUPPORT - , - EXCLUSIVE /**< The instance will only be accepted from one - * DataWriter which is the only one whose modifications will be visible to the - * DataReader objects. - */ - #endif //OMG_DDS_OWNERSHIP_SUPPORT - }; -}; - -typedef dds::core::SafeEnum OwnershipKind; - -struct DurabilityKind_def -{ - enum Type - { - VOLATILE, /**< The samples are not available to late-joining - * DataReaders. In other words, only DataReaders, which were present at the - * time of the writing and have subscribed to this Topic, will receive the sample. - * When a DataReader subscribes afterwards (late-joining), it will only be able to - * read the next written sample. This setting is typically used for data, which is - * updated quickly. - */ - TRANSIENT_LOCAL /**< Currently behaves identically to the - * TRANSIENT_DURABILITY_QOS, except for its RxO properties. The desired - * behaviour of TRANSIENT_LOCAL_DURABILITY_QOS can be achieved from the - * TRANSIENT_DURABILITY_QOS with the default (TRUE) setting of the - * autodispose_unregistered_instances flag on the DataWriter and the - * service_cleanup_delay set to 0 on the durability service. This is because for - * TRANSIENT_LOCAL, the data should only remain available for late-joining - * readers during the lifetime of its source writer, so it is not required to survive after - * its source writer has been deleted. Since the deletion of a writer implicitly - * unregisters all its instances, an autodispose_unregistered_instances - * value of TRUE will also dispose the affected data from the durability store, and - * thus prevent it from remaining available to late joining readers. - */ - #ifdef OMG_DDS_PERSISTENCE_SUPPORT - , - TRANSIENT, /**< Some samples are available to late-joining - * DataReaders (stored in memory). This means that the late-joining - * DataReaders are able to read these previously written samples. The - * DataReader does not necessarily have to exist at the time of writing. Not all - * samples are stored (depending on QosPolicy History and QosPolicy - * resource_limits). The storage does not depend on the DataWriter and will - * outlive the DataWriter. This may be used to implement reallocation of - * applications because the data is saved in the Data Distribution Service (not in the - * DataWriter). This setting is typically used for state related information of an - * application. In this case also the DurabilityServiceQosPolicy settings are - * relevant for the behaviour of the Data Distribution Service. - */ - PERSISTENT /**< The data is stored in permanent storage (e.g. - * hard disk). This means that the samples are also available after a system restart. - * The samples not only outlives the DataWriters, but even the Data Distribution - * Service and the system. This setting is typically used for attributes and settings for - * an application or the system. In this case also the - * DurabilityServiceQosPolicy settings are relevant for the behaviour of the - * Data Distribution Service. - */ - #endif //OMG_DDS_PERSISTENCE_SUPPORT - }; -}; -typedef dds::core::SafeEnum DurabilityKind; - -struct PresentationAccessScopeKind_def -{ - enum Type - { - INSTANCE, /**< Presentation Access Scope is per instance. */ - TOPIC /**< Presentation Access Scope is per topic. */ - - #ifdef OMG_DDS_OBJECT_MODEL_SUPPORT - , - GROUP /**< Presentation Access Scope is per group. */ - #endif // OMG_DDS_OBJECT_MODEL_SUPPORT - }; -}; -typedef dds::core::SafeEnum PresentationAccessScopeKind; - - -struct ReliabilityKind_def -{ - enum Type - { - BEST_EFFORT, /**< The Data Distribution Service will only - * attempt to deliver the data; no arrival-checks are being performed and any lost - * data is not re-transmitted (non-reliable). Presumably new values for the samples - * are generated often enough by the application so that it is not necessary to resent - * or acknowledge any samples. - */ - RELIABLE /**< The Data Distribution Service will attempt to - * deliver all samples in the DataWriters history; arrival-checks are performed - * and data may get re-transmitted in case of lost data. In the steady-state (no - * modifications communicated via the DataWriter) the Data Distribution Service - * guarantees that all samples in the DataWriter history will eventually be - * delivered to the all DataReader objects. Outside the steady-state the - * HistoryQosPolicy and ResourceLimitsQosPolicy determine how - * samples become part of the history and whether samples can be discarded from it. - * In this case also the max_blocking_time must be set. - */ - }; -}; -typedef dds::core::SafeEnum ReliabilityKind; - - -struct DestinationOrderKind_def -{ - enum Type - { - BY_RECEPTION_TIMESTAMP, /**< The order is based on the timestamp, at the moment the sample was - * received by the DataReader. - */ - BY_SOURCE_TIMESTAMP /**< The order is based on the timestamp, which was set by the - * DataWriter. This means that the system needs some time synchronization. - */ - }; -}; - -typedef dds::core::SafeEnum DestinationOrderKind; - -struct HistoryKind_def -{ - enum Type - { - KEEP_LAST, /**< The Data Distribution Service will only attempt to - * keep the latest values of the instance and discard the older ones. The attribute - * “depth” determines how many samples in history will be stored. In other words, - * only the most recent samples in history are stored. On the publishing side, the - * Data Distribution Service will only keep the most recent “depth” samples of each - * instance of data (identified by its key) managed by the DataWriter. On the - * subscribing side, the DataReader will only keep the most recent “depth” - * samples received for each instance (identified by its key) until the application - * “takes” them via the DataReader::take operation. - * KEEP_LAST_HISTORY_QOS - is the default kind. The default value of depth is - * 1, indicating that only the most recent value should be delivered. If a depth other - * than 1 is specified, it should be compatible with the settings of the - * ResourcelimitsQosPolicy max_samples_per_instance. For these two - * QosPolicy settings to be compatible, they must verify that depth <= - * max_samples_per_instance, otherwise a - * RETCODE_INCONSISTENT_POLICY is generated on relevant operations. - */ - KEEP_ALL /**< All samples are stored, provided, the resources are - * available. On the publishing side, the Data Distribution Service will attempt to - * keep all samples (representing each value written) of each instance of data - * (identified by its key) managed by the DataWriter until they can be delivered to - * all subscribers. On the subscribing side, the Data Distribution Service will - * attempt to keep all samples of each instance of data (identified by its key) - * managed by the DataReader. These samples are kept until the application - * “takes” them from the Data Distribution Service via the DataReader::take - * operation. The setting of depth has no effect. Its implied value is - * LENGTH_UNLIMITED. The resources that the Data Distribution Service can use to - * keep this history are limited by the settings of the ResourceLimitsQosPolicy. - * If the limit is reached, the behaviour of the Data Distribution Service will depend - * on the ReliabilityQosPolicy. If the ReliabilityQosPolicy is - * BEST_EFFORT_RELIABILITY_QOS, the old values are discarded. If - * ReliabilityQosPolicy is RELIABLE_RELIABILITY_QOS, the Data - * Distribution Service will block the DataWriter until it can deliver the necessary - * old values to all subscribers. - */ - }; -}; - -typedef dds::core::SafeEnum HistoryKind; - -struct LivelinessKind_def -{ - enum Type - { - AUTOMATIC, /**< The Data Distribution Service will take care of - * reporting the Liveliness automatically with a rate determined by the - * lease_duration. - */ - MANUAL_BY_PARTICIPANT, /**< The application must take care - * of reporting the liveliness before the lease_duration expires. If an Entity - * reports its liveliness, all Entities within the same DomainParticipant that - * have their liveliness kind set to MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, - * can be considered alive by the Data Distribution Service. Liveliness can reported - * explicitly by calling the operation assert_liveliness on the - * DomainParticipant or implicitly by writing some data. - */ - MANUAL_BY_TOPIC /**< The application must take care of - * reporting the liveliness before the lease_duration expires. This can explicitly - * be done by calling the operation assert_liveliness on the DataWriter or - * implicitly by writing some data. - */ - }; -}; -typedef dds::core::SafeEnum LivelinessKind; - -/* This isn't standard! -struct TypeConsistencyEnforcementKind_def -{ - enum Type - { - EXACT_TYPE_TYPE_CONSISTENCY, - EXACT_NAME_TYPE_CONSISTENCY, - DECLARED_TYPE_CONSISTENCY, - ASSIGNABLE_TYPE_CONSISTENCY - }; -}; -*/ -struct TypeConsistencyEnforcementKind_def -{ - using Type = eprosima::fastdds::dds::TypeConsistencyKind; -}; - -typedef dds::core::SafeEnum TypeConsistencyEnforcementKind; - -} //namespace policy -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_POLICY_POLICYKIND_HPP_ diff --git a/include/dds/core/policy/QosPolicyCount.hpp b/include/dds/core/policy/QosPolicyCount.hpp deleted file mode 100644 index 5ab1e2256c3..00000000000 --- a/include/dds/core/policy/QosPolicyCount.hpp +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_POLICY_QOS_POLICY_COUNT_HPP_ -#define OMG_DDS_CORE_POLICY_QOS_POLICY_COUNT_HPP_ - -#include -#include - -namespace dds { -namespace core { -namespace policy { - -using QosPolicyId = detail::QosPolicyId; -using QosPolicyCountSeq = detail::QosPolicyCountSeq; - -/** - * The QosPolicyCount object shows, for a QosPolicy, the total number of - * times that the concerned DataWriter discovered a DataReader for the - * same Topic and a requested DataReaderQos that is incompatible with - * the one offered by the DataWriter. - */ -class QosPolicyCount : public dds::core::Value -{ -public: - - /** - * Creates a QosPolicyCount instance - * - * @param policy_id the policy_id - * @param count the count - */ - QosPolicyCount( - QosPolicyId policy_id, - int32_t count) - : dds::core::Value(policy_id, count) - { - } - - /** - * Copies a QosPolicyCount instance - * - * @param other the QosPolicyCount instance to copy - */ - QosPolicyCount( - const QosPolicyCount& other) - : dds::core::Value(other.policy_id(), other.count()) - { - } - - /** - * Gets the policy_id - * - * @return the policy_id - */ - QosPolicyId policy_id() const - { - return this->delegate().policy_id; - } - - /** - * Gets the count - * - * @return the count - */ - int32_t count() const - { - return this->delegate().count; - } - -}; - -} //namespace policy -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_POLICY_QOS_POLICY_COUNT_HPP_ diff --git a/include/dds/core/policy/detail/CorePolicy.hpp b/include/dds/core/policy/detail/CorePolicy.hpp deleted file mode 100644 index 69ced6d4c3d..00000000000 --- a/include/dds/core/policy/detail/CorePolicy.hpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_POLICY_DETAIL_CORE_POLICY_HPP_ -#define EPROSIMA_DDS_CORE_POLICY_DETAIL_CORE_POLICY_HPP_ - -#include -#include -#include - -/** - * @cond - * Ignore this file in the API - */ - -namespace dds { -namespace core { -namespace policy { -namespace detail { - -// #ifdef OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT -using DataRepresentation = eprosima::fastdds::dds::DataRepresentationQosPolicy; -// #endif // OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT - -using Deadline = eprosima::fastdds::dds::DeadlineQosPolicy; - -using DestinationOrder = eprosima::fastdds::dds::DestinationOrderQosPolicy; - -using Durability = eprosima::fastdds::dds::DurabilityQosPolicy; - -// #ifdef OMG_DDS_PERSISTENCE_SUPPORT -using DurabilityService = eprosima::fastdds::dds::DurabilityServiceQosPolicy; -// #endif // OMG_DDS_PERSISTENCE_SUPPORT - -using EntityFactory = eprosima::fastdds::dds::EntityFactoryQosPolicy; - -using GroupData = eprosima::fastdds::dds::GroupDataQosPolicy; - -using History = eprosima::fastdds::dds::HistoryQosPolicy; - -using LatencyBudget = eprosima::fastdds::dds::LatencyBudgetQosPolicy; - -using Lifespan = eprosima::fastdds::dds::LifespanQosPolicy; - -using Liveliness = eprosima::fastdds::dds::LivelinessQosPolicy; - -using Ownership = eprosima::fastdds::dds::OwnershipQosPolicy; - -// #ifdef OMG_DDS_OWNERSHIP_SUPPORT -using OwnershipStrength = eprosima::fastdds::dds::OwnershipStrengthQosPolicy; -// #endif //OMG_DDS_OWNERSHIP_SUPPORT - -using Partition = eprosima::fastdds::dds::PartitionQosPolicy; - -using Presentation = eprosima::fastdds::dds::PresentationQosPolicy; - -using ReaderDataLifecycle = eprosima::fastdds::dds::ReaderDataLifecycleQosPolicy; - -using Reliability = eprosima::fastdds::dds::ReliabilityQosPolicy; - -using ResourceLimits = eprosima::fastdds::dds::ResourceLimitsQosPolicy; - -using TimeBasedFilter = eprosima::fastdds::dds::TimeBasedFilterQosPolicy; - -using TopicData = eprosima::fastdds::dds::TopicDataQosPolicy; - -using TransportPriority = eprosima::fastdds::dds::TransportPriorityQosPolicy; - -// #ifdef OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT -using TypeConsistencyEnforcement = eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy; -// #endif //OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT - -using UserData = eprosima::fastdds::dds::UserDataQosPolicy; - -using WriterDataLifecycle = eprosima::fastdds::dds::WriterDataLifecycleQosPolicy; - -} //namespace detail -} //namespace policy -} //namespace core -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_CORE_POLICY_DETAIL_CORE_POLICY_HPP_ diff --git a/include/dds/core/policy/detail/CorePolicyImpl.hpp b/include/dds/core/policy/detail/CorePolicyImpl.hpp deleted file mode 100644 index 66b95039c63..00000000000 --- a/include/dds/core/policy/detail/CorePolicyImpl.hpp +++ /dev/null @@ -1,1424 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_POLICY_TCOREPOLICY_IMPL_HPP_ -#define EPROSIMA_DDS_CORE_POLICY_TCOREPOLICY_IMPL_HPP_ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include - -namespace dds { -namespace core { -namespace policy { - -//TUserData - -template -TUserData::TUserData() - : dds::core::Value() -{ -} - -template -TUserData::TUserData( - const dds::core::ByteSeq& sequence) - : dds::core::Value(sequence) -{ -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -TUserData::TUserData( - const uint8_t* value_begin, - const uint8_t* value_end) -{ - //To implement -} - -template -TUserData::TUserData( - const TUserData& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TUserData& TUserData::value( - const dds::core::ByteSeq& sequence) -{ - //To implement - // this->delegate().value(sequence); - // return *this; -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -template -TUserData& TUserData::value( - OCTET_ITER begin, - OCTET_ITER end) -{ - //To implement - //#ifdef _WIN32 - //#pragma warning( push ) - //#pragma warning( disable : 4702 ) //disable warning caused by temporary exception, remove later - //#endif - // ISOCPP_THROW_EXCEPTION(ISOCPP_ERROR, "Function not currently supported"); - //#ifdef _WIN32 - //#pragma warning ( pop ) //re-enable warning to prevent leaking to user code, remove later - //#endif - // return *this; -} - -template -const dds::core::ByteSeq TUserData::value() const -{ - //To implement - // return this->delegate().value(); -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -const uint8_t* TUserData::begin() const -{ - //To implement - //#ifdef _WIN32 - //#pragma warning( push ) - //#pragma warning( disable : 4702 ) //disable warning caused by temporary exception, remove later - //#endif - // ISOCPP_THROW_EXCEPTION(ISOCPP_ERROR, "Function not currently supported"); - //#ifdef _WIN32 - //#pragma warning ( pop ) //re-enable warning to prevent leaking to user code, remove later - //#endif - // return NULL; -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -const uint8_t* TUserData::end() const -{ - //To implement - //#ifdef _WIN32 - //#pragma warning( push ) - //#pragma warning( disable : 4702 ) //disable warning caused by temporary exception, remove later - //#endif - // ISOCPP_THROW_EXCEPTION(ISOCPP_ERROR, "Function not currently supported"); - //#ifdef _WIN32 - //#pragma warning ( pop ) //re-enable warning to prevent leaking to user code, remove later - //#endif - // return NULL; -} - -//TGroupData - -template -TGroupData::TGroupData() - : dds::core::Value() -{ -} - -template -TGroupData::TGroupData( - const dds::core::ByteSeq& sequence) - : dds::core::Value(sequence) -{ -} - -template -TGroupData::TGroupData( - const TGroupData& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TGroupData::TGroupData( - const uint8_t* value_begin, - const uint8_t* value_end) -{ - //To implement - //#ifdef _WIN32 - //#pragma warning( push ) - //#pragma warning( disable : 4702 ) //disable warning caused by temporary exception, remove later - //#endif - // ISOCPP_THROW_EXCEPTION(ISOCPP_ERROR, "Function not currently supported"); - //#ifdef _WIN32 - //#pragma warning ( pop ) //re-enable warning to prevent leaking to user code, remove later - //#endif -} - -template -TGroupData& TGroupData::value( - const dds::core::ByteSeq& sequence) -{ - //To implement - // this->delegate().value(sequence); - // return *this; -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -template -TGroupData& TGroupData::value( - OCTET_ITER begin, - OCTET_ITER end) -{ - //To implement - //#ifdef _WIN32 - //#pragma warning( push ) - //#pragma warning( disable : 4702 ) //disable warning caused by temporary exception, remove later - //#endif - // ISOCPP_THROW_EXCEPTION(ISOCPP_ERROR, "Function not currently supported"); - //#ifdef _WIN32 - //#pragma warning ( pop ) //re-enable warning to prevent leaking to user code, remove later - //#endif - // return *this; -} - -template -const dds::core::ByteSeq TGroupData::value() const -{ - //To implement - // return this->delegate().value(); -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -const uint8_t* TGroupData::begin() const -{ - //To implement - //#ifdef _WIN32 - //#pragma warning( push ) - //#pragma warning( disable : 4702 ) //disable warning caused by temporary exception, remove later - //#endif - // ISOCPP_THROW_EXCEPTION(ISOCPP_ERROR, "Function not currently supported"); - //#ifdef _WIN32 - //#pragma warning ( pop ) //re-enable warning to prevent leaking to user code, remove later - //#endif - // return NULL; -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -const uint8_t* TGroupData::end() const -{ - //To implement - //#ifdef _WIN32 - //#pragma warning( push ) - //#pragma warning( disable : 4702 ) //disable warning caused by temporary exception, remove later - //#endif - // ISOCPP_THROW_EXCEPTION(ISOCPP_ERROR, "Function not currently supported"); - //#ifdef _WIN32 - //#pragma warning ( pop ) //re-enable warning to prevent leaking to user code, remove later - //#endif - // return NULL; -} - -//TTopicData - -template -TTopicData::TTopicData() - : dds::core::Value() -{ -} - -template -TTopicData::TTopicData( - const dds::core::ByteSeq& sequence) - : dds::core::Value(sequence) -{ -} - -template -TTopicData::TTopicData( - const TTopicData& other) - : dds::core::Value(other.delegate()) -{ -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -TTopicData::TTopicData( - const uint8_t* value_begin, - const uint8_t* value_end) -{ - //To implement - -} - -template -TTopicData& TTopicData::value( - const dds::core::ByteSeq& sequence) -{ - //To implement - // this->delegate().value(sequence); - // return *this; -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -template -TTopicData& TTopicData::value( - OCTET_ITER begin, - OCTET_ITER end) -{ - //To implement - //#ifdef _WIN32 - //#pragma warning( push ) - //#pragma warning( disable : 4702 ) //disable warning caused by temporary exception, remove later - //#endif - // ISOCPP_THROW_EXCEPTION(ISOCPP_ERROR, "Function not currently supported"); - //#ifdef _WIN32 - //#pragma warning ( pop ) //re-enable warning to prevent leaking to user code, remove later - //#endif - // return *this; -} - -template -const dds::core::ByteSeq TTopicData::value() const -{ - //To implement - // return this->delegate().value(); -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -const uint8_t* TTopicData::begin() const -{ - //To implement - //#ifdef _WIN32 - //#pragma warning( push ) - //#pragma warning( disable : 4702 ) //disable warning caused by temporary exception, remove later - //#endif - // ISOCPP_THROW_EXCEPTION(ISOCPP_ERROR, "Function not currently supported"); - //#ifdef _WIN32 - //#pragma warning ( pop ) //re-enable warning to prevent leaking to user code, remove later - //#endif - // return NULL; -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -const uint8_t* TTopicData::end() const -{ - //To implement - //#ifdef _WIN32 - //#pragma warning( push ) - //#pragma warning( disable : 4702 ) //disable warning caused by temporary exception, remove later - //#endif - // ISOCPP_THROW_EXCEPTION(ISOCPP_ERROR, "Function not currently supported"); - //#ifdef _WIN32 - //#pragma warning ( pop ) //re-enable warning to prevent leaking to user code, remove later - //#endif - // return NULL; -} - -//TEntityFactory - -template -TEntityFactory::TEntityFactory( - bool autoenable_created_entities) - : dds::core::Value(autoenable_created_entities) -{ -} - -template -TEntityFactory::TEntityFactory( - const TEntityFactory& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TEntityFactory& TEntityFactory::autoenable_created_entities( - bool autoenable_created_entities) -{ - //To implement - // this->delegate().auto_enable(autoenable_created_entities); - // return *this; -} - -template -bool TEntityFactory::autoenable_created_entities() const -{ - //To implement - // return this->delegate().auto_enable(); -} - -template -TEntityFactory TEntityFactory::AutoEnable() -{ - //To implement - // return TEntityFactory(true); -} - -template -TEntityFactory TEntityFactory::ManuallyEnable() -{ - //To implement - // return TEntityFactory(false); -} - -//TTransportPriority - -template -TTransportPriority::TTransportPriority( - int32_t priority) - : dds::core::Value(priority) -{ -} - -template -TTransportPriority::TTransportPriority( - const TTransportPriority& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TTransportPriority& TTransportPriority::value( - int32_t priority) -{ - //To implement - // this->delegate().value(priority); - // return *this; -} - -template -int32_t TTransportPriority::value() const -{ - //To implement - // return this->delegate().value(); -} - -//TLifeSpan - -template -TLifespan::TLifespan( - const dds::core::Duration& duration) - : dds::core::Value(duration) -{ -} - -template -TLifespan::TLifespan( - const TLifespan& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TLifespan& TLifespan::duration( - const dds::core::Duration& duration) -{ - //To implement - // this->delegate().duration(duration); - // return *this; -} - -template -const dds::core::Duration TLifespan::duration() const -{ - //To implement - // return this->delegate().duration(); -} - -//TDeadline - -template -TDeadline::TDeadline( - const dds::core::Duration& period) - : dds::core::Value(period) -{ -} - -template -TDeadline::TDeadline( - const TDeadline& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TDeadline& TDeadline::period( - const dds::core::Duration& period) -{ - //To implement - // this->delegate().period(period); - // return *this; -} - -template -const dds::core::Duration TDeadline::period() const -{ - //To implement - // return this->delegate().period(); -} - -//TLatencyBudget - -template -TLatencyBudget::TLatencyBudget( - const dds::core::Duration& duration) - : dds::core::Value(duration) -{ -} - -template -TLatencyBudget::TLatencyBudget( - const TLatencyBudget& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TLatencyBudget& TLatencyBudget::duration( - const dds::core::Duration& duration) -{ - //To implement - // this->delegate().duration(duration); - // return *this; -} - -template -const dds::core::Duration TLatencyBudget::duration() const -{ - //To implement - // return this->delegate().duration(); -} - -//TTimeBasedFilter -template -TTimeBasedFilter::TTimeBasedFilter( - const dds::core::Duration& minimum_separation) - : dds::core::Value(minimum_separation) -{ -} - -template -TTimeBasedFilter::TTimeBasedFilter( - const TTimeBasedFilter& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TTimeBasedFilter& TTimeBasedFilter::minimum_separation( - const dds::core::Duration& minimum_separation) -{ - //To implement - // this->delegate().min_separation(minimum_separation); - // return *this; - -} - -template -const dds::core::Duration TTimeBasedFilter::minimum_separation() const -{ - //To implement - // return this->delegate().min_separation(); -} - -//TPartition - -template -TPartition::TPartition( - const std::string& name) - : dds::core::Value(name) -{ -} - -template -TPartition::TPartition( - const dds::core::StringSeq& names) - : dds::core::Value(names) -{ -} - -template -TPartition::TPartition( - const TPartition& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TPartition& TPartition::name( - const std::string& name) -{ - //To implement - // this->delegate().name(name); - // return *this; -} - -template -TPartition& TPartition::name( - const dds::core::StringSeq& names) -{ - //To implement - // this->delegate().name(names); - // return *this; -} - -template -const dds::core::StringSeq TPartition::name() const -{ - //To implement - // return this->delegate().name(); -} - -#ifdef OMG_DDS_OWNERSHIP_SUPPORT - -//TOwnership - -template -TOwnership::TOwnership( - dds::core::policy::OwnershipKind::Type kind) - : dds::core::Value(kind) -{ -} - -template -TOwnership::TOwnership( - const TOwnership& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TOwnership& TOwnership::kind( - dds::core::policy::OwnershipKind::Type kind) -{ - //To implement - // this->delegate().kind(kind); - // return *this; -} - -template -dds::core::policy::OwnershipKind::Type TOwnership::kind() const -{ - //To implement - // return this->delegate().kind(); -} - -template -TOwnership TOwnership::Exclusive() -{ - //To implement - // return TOwnership(dds::core::policy::OwnershipKind::EXCLUSIVE); -} - -template -TOwnership TOwnership::Shared() -{ - //To implement - // return TOwnership(dds::core::policy::OwnershipKind::SHARED); -} - -//TOwnershipStrength -template -TOwnershipStrength::TOwnershipStrength( - int32_t strength) - : dds::core::Value(strength) -{ -} - -template -TOwnershipStrength::TOwnershipStrength( - const TOwnershipStrength& other) - : dds::core::Value(other.delegate()) -{ -} - -template -int32_t TOwnershipStrength::value() const -{ - //To implement - // return this->delegate().strength(); -} - -template -TOwnershipStrength& TOwnershipStrength::value( - int32_t strength) -{ - //To implement - // this->delegate().strength(strength); - // return *this; -} - -#endif //OMG_DDS_OWNERSHIP_SUPPORT - -//TWriterDataLifeCycle -template -TWriterDataLifecycle::TWriterDataLifecycle( - bool autodispose_unregistered_instances) - : dds::core::Value(autodispose_unregistered_instances) -{ -} - -template -TWriterDataLifecycle::TWriterDataLifecycle( - const TWriterDataLifecycle& other) - : dds::core::Value(other.delegate()) -{ -} - -template -bool TWriterDataLifecycle::autodispose_unregistered_instances() const -{ - //To implement - // return this->delegate().autodispose(); -} - -template -TWriterDataLifecycle& TWriterDataLifecycle::autodispose_unregistered_instances( - bool autodispose_unregistered_instances) -{ - //To implement - // this->delegate().autodispose(autodispose_unregistered_instances); - // return *this; -} - -template -TWriterDataLifecycle TWriterDataLifecycle::AutoDisposeUnregisteredInstances() -{ - //To implement - // return TWriterDataLifecycle(true); -} - -template -TWriterDataLifecycle TWriterDataLifecycle::ManuallyDisposeUnregisteredInstances() -{ - //To implement - // return TWriterDataLifecycle(false); -} - -//TReaderDataLifecycle -template -TReaderDataLifecycle::TReaderDataLifecycle( - const dds::core::Duration& autopurge_nowriter_samples_delay, - const dds::core::Duration& autopurge_disposed_samples_delay) - : dds::core::Value(autopurge_nowriter_samples_delay, autopurge_disposed_samples_delay) -{ -} - -template -TReaderDataLifecycle::TReaderDataLifecycle( - const TReaderDataLifecycle& other) - : dds::core::Value(other.delegate()) -{ -} - -template -const dds::core::Duration TReaderDataLifecycle::autopurge_nowriter_samples_delay() const -{ - //To implement - // return this->delegate().autopurge_nowriter_samples_delay(); -} - -template -TReaderDataLifecycle& TReaderDataLifecycle::autopurge_nowriter_samples_delay( - const dds::core::Duration& autopurge_nowriter_samples_delay) -{ - //To implement - // this->delegate().autopurge_nowriter_samples_delay(autopurge_nowriter_samples_delay); - // return *this; -} - -template -const dds::core::Duration TReaderDataLifecycle::autopurge_disposed_samples_delay() const -{ - //To implement - // return this->delegate().autopurge_disposed_samples_delay(); -} - -template -TReaderDataLifecycle& TReaderDataLifecycle::autopurge_disposed_samples_delay( - const dds::core::Duration& autopurge_disposed_samples_delay) -{ - //To implement - // this->delegate().autopurge_disposed_samples_delay(autopurge_disposed_samples_delay); - // return *this; -} - -template -TReaderDataLifecycle TReaderDataLifecycle::NoAutoPurgeDisposedSamples() -{ - //To implement - // return TReaderDataLifecycle(); -} - -template -TReaderDataLifecycle TReaderDataLifecycle::AutoPurgeDisposedSamples( - const dds::core::Duration& autopurge_disposed_samples_delay) -{ - //To implement - // return TReaderDataLifecycle().autopurge_disposed_samples_delay(autopurge_disposed_samples_delay); -} - -//TDurability - -template -TDurability::TDurability( - dds::core::policy::DurabilityKind::Type kind) - : dds::core::Value(kind) -{ -} - -template -TDurability::TDurability( - const TDurability& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TDurability& TDurability::kind( - dds::core::policy::DurabilityKind::Type kind) -{ - //To implement - // this->delegate().kind(kind); - // return *this; -} - -template -dds::core::policy::DurabilityKind::Type TDurability::kind() const -{ - //To implement - // return this->delegate().kind(); -} - -template -TDurability TDurability::Volatile() -{ - //To implement - // return TDurability(dds::core::policy::DurabilityKind::VOLATILE); -} - -template -TDurability TDurability::TransientLocal() -{ - //To implement - // return TDurability(dds::core::policy::DurabilityKind::TRANSIENT_LOCAL); -} - -template -TDurability TDurability::Transient() -{ - //To implement - // return TDurability(dds::core::policy::DurabilityKind::TRANSIENT); -} - -template -TDurability TDurability::Persistent() -{ - //To implement - // return TDurability(dds::core::policy::DurabilityKind::PERSISTENT); -} - -//TPresentation -template -TPresentation::TPresentation( - dds::core::policy::PresentationAccessScopeKind::Type access_scope, - bool coherent_access, - bool ordered_access) - : dds::core::Value(access_scope, coherent_access, ordered_access) -{ -} - -template -TPresentation::TPresentation( - const TPresentation& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TPresentation& TPresentation::access_scope( - dds::core::policy::PresentationAccessScopeKind::Type access_scope) -{ - //To implement - // this->delegate().access_scope(access_scope); - // return *this; -} - -template -dds::core::policy::PresentationAccessScopeKind::Type TPresentation::access_scope() const -{ - //To implement - // return this->delegate().access_scope(); -} - -template -TPresentation& TPresentation::coherent_access( - bool coherent_access) -{ - //To implement - // this->delegate().coherent_access(coherent_access); - // return *this; -} - -template -bool TPresentation::coherent_access() const -{ - //To implement - // return this->delegate().coherent_access(); -} - -template -TPresentation& TPresentation::ordered_access( - bool ordered_access) -{ - //To implement - // this->delegate().ordered_access(ordered_access); - // return *this; -} - -template -bool TPresentation::ordered_access() const -{ - //To implement - // return this->delegate().ordered_access(); -} - -template -TPresentation TPresentation::GroupAccessScope( - bool coherent_access, - bool ordered_access) -{ - //To implement - // return TPresentation(dds::core::policy::PresentationAccessScopeKind::GROUP, coherent_access, ordered_access); -} - -template -TPresentation TPresentation::InstanceAccessScope( - bool coherent_access, - bool ordered_access) -{ - //To implement - // return TPresentation(dds::core::policy::PresentationAccessScopeKind::INSTANCE, coherent_access, ordered_access); -} - -template -TPresentation TPresentation::TopicAccessScope( - bool coherent_access, - bool ordered_access) -{ - //To implement - // return TPresentation(dds::core::policy::PresentationAccessScopeKind::TOPIC, coherent_access, ordered_access); -} - -//TReliability -template -TReliability::TReliability( - dds::core::policy::ReliabilityKind::Type kind, - const dds::core::Duration& max_blocking_time) - : dds::core::Value(kind, max_blocking_time) -{ -} - -template -TReliability::TReliability( - const TReliability& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TReliability& TReliability::kind( - dds::core::policy::ReliabilityKind::Type kind) -{ - //To implement - // this->delegate().kind(kind); - // return *this; -} - -template -dds::core::policy::ReliabilityKind::Type TReliability::kind() const -{ - //To implement - // return this->delegate().kind(); -} - -template -TReliability& TReliability::max_blocking_time( - const dds::core::Duration& max_blocking_time) -{ - //To implement - // this->delegate().max_blocking_time(max_blocking_time); - // return *this; -} - -template -const dds::core::Duration TReliability::max_blocking_time() const -{ - //To implement - // return this->delegate().max_blocking_time(); -} - -template -TReliability TReliability::Reliable( - const dds::core::Duration& max_blocking_time) -{ - //To implement - // return TReliability(dds::core::policy::ReliabilityKind::RELIABLE, max_blocking_time); -} - -template -TReliability TReliability::BestEffort( - const dds::core::Duration& max_blocking_time) -{ - //To implement - // return TReliability(dds::core::policy::ReliabilityKind::BEST_EFFORT, max_blocking_time); -} - -//TDestinationOrder - -template -TDestinationOrder::TDestinationOrder( - dds::core::policy::DestinationOrderKind::Type kind) - : dds::core::Value(kind) -{ -} - -template -TDestinationOrder::TDestinationOrder( - const TDestinationOrder& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TDestinationOrder& TDestinationOrder::kind( - dds::core::policy::DestinationOrderKind::Type kind) -{ - //To implement - // this->delegate().kind(kind); - // return *this; -} - -template -dds::core::policy::DestinationOrderKind::Type TDestinationOrder::kind() const -{ - //To implement - // return this->delegate().kind(); -} - -template -TDestinationOrder TDestinationOrder::SourceTimestamp() -{ - //To implement - // return TDestinationOrder(dds::core::policy::DestinationOrderKind::BY_SOURCE_TIMESTAMP); -} - -template -TDestinationOrder TDestinationOrder::ReceptionTimestamp() -{ - //To implement - // return TDestinationOrder(dds::core::policy::DestinationOrderKind::BY_RECEPTION_TIMESTAMP); -} - -//THistory -template -THistory::THistory( - dds::core::policy::HistoryKind::Type kind, - int32_t depth) - : dds::core::Value(kind, depth) -{ -} - -template -THistory::THistory( - const THistory& other) - : dds::core::Value(other.delegate()) -{ -} - -template -dds::core::policy::HistoryKind::Type THistory::kind() const -{ - //To implement - // return this->delegate().kind(); -} - -template -THistory& THistory::kind( - dds::core::policy::HistoryKind::Type kind) -{ - //To implement - // this->delegate().kind(kind); - // return *this; -} - -template -int32_t THistory::depth() const -{ - //To implement - // return this->delegate().depth(); -} - -template -THistory& THistory::depth( - int32_t depth) -{ - //To implement - // this->delegate().depth(depth); - // return *this; -} - -template -THistory THistory::KeepAll() -{ - //To implement - // return THistory(dds::core::policy::HistoryKind::KEEP_ALL, 1); -} - -template -THistory THistory::KeepLast( - uint32_t depth) -{ - //To implement - // return THistory(dds::core::policy::HistoryKind::KEEP_LAST, depth); -} - -//TResourceLimits -template -TResourceLimits::TResourceLimits( - int32_t max_samples, - int32_t max_instances, - int32_t max_samples_per_instance) - : dds::core::Value(max_samples, max_instances, max_samples_per_instance) -{ -} - -template -TResourceLimits::TResourceLimits( - const TResourceLimits& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TResourceLimits& TResourceLimits::max_samples( - int32_t max_samples) -{ - //To implement - // this->delegate().max_samples(max_samples); - // return *this; -} - -template -int32_t TResourceLimits::max_samples() const -{ - //To implement - // return this->delegate().max_samples(); -} - -template -TResourceLimits& TResourceLimits::max_instances( - int32_t max_instances) -{ - //To implement - // this->delegate().max_instances(max_instances); - // return *this; -} - -template -int32_t TResourceLimits::max_instances() const -{ - //To implement - // return this->delegate().max_instances(); -} - -template -TResourceLimits& TResourceLimits::max_samples_per_instance( - int32_t max_samples_per_instance) -{ - //To implement - // this->delegate().max_samples_per_instance(max_samples_per_instance); - // return *this; -} - -template -int32_t TResourceLimits::max_samples_per_instance() const -{ - //To implement - // return this->delegate().max_samples_per_instance(); -} - -//TLiveliness -template -TLiveliness::TLiveliness( - dds::core::policy::LivelinessKind::Type kind, - const dds::core::Duration& lease_duration) - : dds::core::Value(kind, lease_duration) -{ -} - -template -TLiveliness::TLiveliness( - const TLiveliness& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TLiveliness& TLiveliness::kind( - dds::core::policy::LivelinessKind::Type kind) -{ - //To implement - // this->delegate().kind(kind); - // return *this; -} - -template -dds::core::policy::LivelinessKind::Type TLiveliness::kind() const -{ - //To implement - // return this->delegate().kind(); -} - -template -TLiveliness& TLiveliness::lease_duration( - const dds::core::Duration& lease_duration) -{ - //To implement - // this->delegate().lease_duration(lease_duration); - // return *this; -} - -template -const dds::core::Duration TLiveliness::lease_duration() const -{ - //To implement - // return this->delegate().lease_duration(); -} - -template -TLiveliness TLiveliness::Automatic() -{ - //To implement - // return TLiveliness(dds::core::policy::LivelinessKind::AUTOMATIC, dds::core::Duration::infinite()); -} - -template -TLiveliness TLiveliness::ManualByParticipant( - const dds::core::Duration& lease_duration) -{ - //To implement - // return TLiveliness(dds::core::policy::LivelinessKind::MANUAL_BY_PARTICIPANT, lease_duration); -} - -template -TLiveliness TLiveliness::ManualByTopic( - const dds::core::Duration& lease_duration) -{ - //To implement - // return TLiveliness(dds::core::policy::LivelinessKind::MANUAL_BY_TOPIC, lease_duration); -} - -#ifdef OMG_DDS_PERSISTENCE_SUPPORT - -//TDurabilityService - -template -TDurabilityService::TDurabilityService( - const dds::core::Duration& service_cleanup_delay, - dds::core::policy::HistoryKind::Type history_kind, - int32_t history_depth, - int32_t max_samples, - int32_t max_instances, - int32_t max_samples_per_instance) - : dds::core::Value(service_cleanup_delay, - history_kind, - history_depth, - max_samples, - max_instances, - max_samples_per_instance) -{ -} - -template -TDurabilityService::TDurabilityService( - const TDurabilityService& other) - : dds::core::Value(other.delegate()) -{ -} - -template -TDurabilityService& TDurabilityService::service_cleanup_delay( - const dds::core::Duration& service_cleanup_delay) -{ - //To implement - // this->delegate().service_cleanup_delay(service_cleanup_delay); - // return *this; -} - -template -const dds::core::Duration TDurabilityService::service_cleanup_delay() const -{ - //To implement - return this->delegate().service_cleanup_delay(); -} - -template -TDurabilityService& TDurabilityService::history_kind( - dds::core::policy::HistoryKind::Type kind) -{ - //To implement - // this->delegate().history_kind(kind); - // return *this; -} - -template -dds::core::policy::HistoryKind::Type TDurabilityService::history_kind() const -{ - //To implement - // return this->delegate().history_kind(); -} - -template -TDurabilityService& TDurabilityService::history_depth( - int32_t history_depth) -{ - //To implement - // this->delegate().history_depth(history_depth); - // return *this; -} - -template -int32_t TDurabilityService::history_depth() const -{ - //To implement - // return this->delegate().history_depth(); -} - -template -TDurabilityService& TDurabilityService::max_samples( - int32_t max_samples) -{ - //To implement - // this->delegate().max_samples(max_samples); - // return *this; -} - -template -int32_t TDurabilityService::max_samples() const -{ - //To implement - // return this->delegate().max_samples(); -} - -template -TDurabilityService& TDurabilityService::max_instances( - int32_t max_instances) -{ - //To implement - // this->delegate().max_instances(max_instances); - // return *this; -} - -template -int32_t TDurabilityService::max_instances() const -{ - //To implement - // return this->delegate().max_instances(); -} - -template -TDurabilityService& TDurabilityService::max_samples_per_instance( - int32_t max_samples_per_instance) -{ - //To implement - // this->delegate().max_samples_per_instance(max_samples_per_instance); - // return *this; -} - -template -int32_t TDurabilityService::max_samples_per_instance() const -{ - //To implement - // return this->delegate().max_samples_per_instance(); -} - -#endif // OMG_DDS_PERSISTENCE_SUPPORT - - -#ifdef OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT - -//TDataRepresentation - -/** @internal @bug OSPL-1746 Implementation required */ -template -TDataRepresentation::TDataRepresentation( - const dds::core::policy::DataRepresentationIdSeq& value); - -template -TDataRepresentation::TDataRepresentation( - const TDataRepresentation& other) - : dds::core::Value(other.delegate()) -{ -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -TDataRepresentation& TDataRepresentation::value( - const dds::core::policy::DataRepresentationIdSeq& value); - -/** @internal @bug OSPL-1746 Implementation required */ -template -const dds::core::policy::DataRepresentationIdSeq TDataRepresentation::value() const; - -#endif //OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT - -#ifdef OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT - -//TTypeConsistencyEnforcement - -/** @internal @bug OSPL-1746 Implementation required */ -template -TTypeConsistencyEnforcement::TTypeConsistencyEnforcement( - dds::core::policy::TypeConsistencyEnforcementKind::Type kind) -{ -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -TTypeConsistencyEnforcement& TTypeConsistencyEnforcement::kind( - dds::core::policy::TypeConsistencyEnforcementKind::Typekind) -{ -} - -/** @internal @bug OSPL-1746 Implementation required */ -template -dds::core::policy::TypeConsistencyEnforcementKind::Type TTypeConsistencyEnforcement::kind() const -{ -} - -#endif //OMG_DDS_EXTENSIBLE_AND_DYNAMIC_TOPIC_TYPE_SUPPORT - -} //namespace policy -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_POLICY_TCOREPOLICY_IMPL_HPP_ diff --git a/include/dds/core/policy/detail/QosPolicyCount.hpp b/include/dds/core/policy/detail/QosPolicyCount.hpp deleted file mode 100644 index b384edd470c..00000000000 --- a/include/dds/core/policy/detail/QosPolicyCount.hpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_POLICY_DETAIL_QOS_POLICY_COUNT_HPP_ -#define EPROSIMA_DDS_CORE_POLICY_DETAIL_QOS_POLICY_COUNT_HPP_ - -#include - -/** - * @cond - * Ignore this file in the API - */ - -namespace dds { -namespace core { -namespace policy { -namespace detail { - -using QosPolicyId = eprosima::fastdds::dds::QosPolicyId_t; - -using QosPolicyCount = eprosima::fastdds::dds::QosPolicyCount; - -using QosPolicyCountSeq = eprosima::fastdds::dds::QosPolicyCountSeq; - -} //namespace detail -} //namespace policy -} //namespace core -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_CORE_POLICY_DETAIL_QOS_POLICY_COUNT_HPP_ diff --git a/include/dds/core/ref_traits.hpp b/include/dds/core/ref_traits.hpp deleted file mode 100644 index 8c93fcf439f..00000000000 --- a/include/dds/core/ref_traits.hpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_REF_TRAITS_H_ -#define OMG_DDS_CORE_REF_TRAITS_H_ - -namespace dds { -namespace core { - -/** @cond - * These traits must be provided by compliant implementations - * to enable safe polymorphic casts. - */ - -template< - typename T1, - typename T2> -struct is_base_of; - -template< - typename T1, - typename T2> -struct is_same; - -template -struct smart_ptr_traits; - -template< - typename TO, - typename FROM> -TO polymorphic_cast( - FROM& from); - -/** @endcond */ - -} //namespace core -} //namespace dds - -// This include should stay here as it provides implementations -// for the declaration immediately above. -#include - -#endif //OMG_DDS_CORE_REF_TRAITS_H diff --git a/include/dds/core/refmacros.hpp b/include/dds/core/refmacros.hpp deleted file mode 100644 index f7589b0c2b9..00000000000 --- a/include/dds/core/refmacros.hpp +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_REFMACROS_HPP_ -#define OMG_DDS_CORE_REFMACROS_HPP_ - -//////////////////////////////////////////////////////////////////////////////// -// Macros -//////////////////////////////////////////////////////////////////////////////// - -#define DECLARE_TYPE_TRAITS(TYPE) \ - typedef TYPE TYPE ## _T; \ - typedef typename ::dds::core::smart_ptr_traits::ref_type TYPE ## _REF_T; \ - typedef typename ::dds::core::smart_ptr_traits::weak_ref_type TYPE ## _WEAK_REF_T; - - -/* - * This macro defines all the functions that Reference Types have to implement. - */ -//////////////////////////////////////////////////////////////////////////////// -// Defines all the types, functions and attributes required for a Reference type -// without default ctor. -// - -#define OMG_DDS_REF_TYPE_BASE(TYPE, BASE, DELEGATE) \ -public: \ - typedef typename ::dds::core::smart_ptr_traits< DELEGATE >::ref_type DELEGATE_REF_T; \ - typedef typename ::dds::core::smart_ptr_traits< DELEGATE >::weak_ref_type DELEGATE_WEAK_REF_T; \ - \ -protected: \ - const typename ::dds::core::Reference< DELEGATE >::DELEGATE_REF_T& impl() const \ - { return ::dds::core::Reference< DELEGATE >::impl_; } \ - typename ::dds::core::Reference< DELEGATE >::DELEGATE_REF_T& impl() \ - { return ::dds::core::Reference< DELEGATE >::impl_; } \ - \ -public: \ - typedef BASE< DELEGATE > BASE_T; \ - \ -public: \ - TYPE(const dds::core::null_type&) : dds::core::Reference< DELEGATE >(static_cast(NULL)) { } \ - \ - TYPE& operator =( \ - const dds::core::null_type& rhs) { \ - *this = TYPE(rhs); \ - return *this; \ - } \ - \ -public: \ - TYPE(const DELEGATE_REF_T &ref) \ - : dds::core::Reference< DELEGATE >(ref) \ - { } - -#define OMG_DDS_IMPLICIT_REF_BASE(TYPE) \ -public: \ - template \ - TYPE(const H__ &h) \ - { \ - if (h.is_nil()){ \ - /* We got a null object and are not really able to do a typecheck here. */ \ - /* So, just set a null object. */ \ - *this = dds::core::null; \ - } else { \ - this->impl_ = h.delegate(); \ - if (h.delegate() != this->::dds::core::Reference< DELEGATE_T >::impl_){ \ - throw dds::core::IllegalOperationError(std::string( \ - "Attempted invalid cast: ") + typeid(h).name() + " to " + typeid(*this).name()); \ - } \ - } \ - } \ - \ - template \ - TYPE& \ - operator =( \ - const T__& rhs) { \ - if (this != (TYPE*)&rhs){ \ - if (rhs.is_nil()){ \ - /* We got a null object and are not really able to do a typecheck here. */ \ - /* So, just set a null object. */ \ - *this = dds::core::null; \ - } else { \ - TYPE other(rhs); \ - /* Dont have to copy when the delegate impl is the same. */ \ - if (other.delegate() != this->::dds::core::Reference< DELEGATE_T >::impl_){ \ - *this = other; \ - } \ - } \ - } \ - return *this; \ - } - -#define OMG_DDS_EXPLICIT_REF_BASE_DECL(TYPE, FROM) \ -public: \ - TYPE(const FROM &h); \ - \ - TYPE& \ - operator =( \ - const FROM& rhs); - -#define OMG_DDS_EXPLICIT_REF_BASE(TYPE, FROM) \ -public: \ - /* We need to support both const and non-const conversion explicitly, because it could */ \ - /* be that the class has a constructor that takes a single non-const template argument. */ \ - /* That non-const templated constructor is a closer match than TYPE(const FROM& h); when */ \ - /* creating the TYPE class from a non-const FROM object. */ \ - TYPE(FROM & h) { this->explicit_conversion(const_cast(h)); } \ - TYPE(const FROM &h) { this->explicit_conversion(h); } \ -private: \ - void explicit_conversion(const FROM &h) \ - { \ - if (h.is_nil()){ \ - /* We got a null object and are not really able to do a typecheck here. */ \ - /* So, just set a null object. */ \ - *this = dds::core::null; \ - } else { \ - this->impl_ = h.delegate(); \ - if (h.delegate() != this->::dds::core::Reference< DELEGATE_T >::impl_){ \ - throw dds::core::IllegalOperationError(std::string( \ - "Attempted invalid cast: ") + typeid(h).name() + " to " + typeid(*this).name()); \ - } \ - } \ - } \ - \ -public: \ - TYPE& \ - operator =( \ - const FROM& rhs) { \ - if (this != (TYPE*)&rhs){ \ - if (rhs.is_nil()){ \ - /* We got a null object and are not really able to do a typecheck here. */ \ - /* So, just set a null object. */ \ - *this = dds::core::null; \ - } else { \ - TYPE other(rhs); \ - /* Dont have to copy when the delegate is the same. */ \ - if (other.delegate() != this->::dds::core::Reference< DELEGATE_T >::impl_){ \ - *this = other; \ - } \ - } \ - } \ - return *this; \ - } - -//////////////////////////////////////////////////////////////////////////////// -// Declares a reference type equipped with a default ctor. -// -#define OMG_DDS_REF_TYPE_PROTECTED_DC(TYPE, BASE, DELEGATE) \ -public: \ - typedef DELEGATE DELEGATE_T; \ - OMG_DDS_REF_TYPE_BASE(TYPE, BASE, DELEGATE_T) \ -protected: \ - TYPE() { } - -#define OMG_DDS_REF_TYPE_PROTECTED_DC_T(TYPE, BASE, T_PARAM, DELEGATE) \ -public: \ - typedef DELEGATE DELEGATE_T; \ - OMG_DDS_REF_TYPE_BASE(TYPE, BASE, DELEGATE_T) \ -protected: \ - TYPE() { } - -#define OMG_DDS_REF_TYPE_NO_DC(TYPE, BASE, DELEGATE) \ -public: \ - typedef DELEGATE DELEGATE_T; \ - OMG_DDS_REF_TYPE_BASE(TYPE, BASE, DELEGATE_T) - -#define OMG_DDS_REF_TYPE_DELEGATE_C(TYPE, BASE, DELEGATE) \ - OMG_DDS_REF_TYPE_PROTECTED_DC(TYPE, BASE, DELEGATE) \ -public: \ - TYPE(DELEGATE_T * impl) : dds::core::Reference< DELEGATE_T >(impl) { } - -#endif //OMG_DDS_CORE_REFMACROS_HPP_ diff --git a/include/dds/core/status/State.hpp b/include/dds/core/status/State.hpp deleted file mode 100644 index 0f62dfc9912..00000000000 --- a/include/dds/core/status/State.hpp +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_STATUS_STATE_HPP_ -#define OMG_DDS_CORE_STATUS_STATE_HPP_ - -#include -#include -#include - -#include - - -namespace dds { -namespace core { -namespace status { - -/** - * @brief - * Class to contain the statistics about samples that have been rejected. - * - * @see @ref DCPS_Modules_Subscription_SampleInfo "SampleInfo" for more information - */ -class OMG_DDS_API SampleRejectedState : public std::bitset -{ -public: - - /** - * Convenience typedef for std::bitset. - */ - typedef std::bitset MaskType; - - /** - * Construct an empty SampleRejectedState. - */ - SampleRejectedState() - : std::bitset() - { - } - - /** - * Copy constructor. - * - * Construct an SampleRejectedState with existing SampleRejectedState. - * - * @param src the SampleRejectedState to copy from - */ - SampleRejectedState( - const SampleRejectedState& src) - : std::bitset(src) - { - } - - /** - * Construct a SampleRejectedState with existing MaskType. - * - * @param src the MaskType to copy from - */ - SampleRejectedState( - const MaskType& src) - : std::bitset(src) - { - } - - /** - * Get the NOT_REJECTED. - * - *not_rejected - * - No sample has been rejected yet. - * - * @return the not_rejected SampleRejectedState - */ - inline static SampleRejectedState not_rejected() - { - return SampleRejectedState(0u); - } - - /** - * Get the REJECTED_BY_SAMPLES_LIMIT. - * - *rejected_by_samples_limit - * - The sample was rejected because it would - * exceed the maximum number of samples set by the ResourceLimits - * QosPolicy. - * - * @return the rejected_by_samples_limit SampleRejectedState - */ - inline static SampleRejectedState rejected_by_samples_limit() - { - return SampleRejectedState(0x0001 << 1u); - } - - /** - * Get the REJECTED_BY_INSTANCES_LIMIT. - * - *rejected_by_instances_limit - * - The sample was rejected because it would - * exceed the maximum number of instances set by the - * ResourceLimits QosPolicy. - * - * @return the rejected_by_instances_limit SampleRejectedState - */ - inline static SampleRejectedState rejected_by_instances_limit() - { - return SampleRejectedState(0x0001 << 0u); - } - - /** - * Get the REJECTED_BY_SAMPLES_PER_INSTANCE_LIMIT. - * - *rejected_by_samples_per_instance_limit - * - The sample was rejected - * because it would exceed the maximum number of samples per - * instance set by the ResourceLimits QosPolicy. - * - * @return the rejected_by_samples_per_instance_limit SampleRejectedState - */ - inline static SampleRejectedState rejected_by_samples_per_instance_limit() - { - return SampleRejectedState(0x0001 << 2u); - } - -private: - - SampleRejectedState( - uint32_t s) - : std::bitset(s) - { - } - -}; - -/** - * @brief - * StatusMask is a bitmap or bitset field. - * - * This bitset is used to: - * - determine which listener functions to call - * - set conditions in dds::core::cond::StatusCondition - * - indicate status changes when calling dds::core::Entity::status_changes - * - * @see @ref DCPS_Modules_Infrastructure_Status "Status concept" - */ -using StatusMask = eprosima::fastdds::dds::StatusMask; - -} //namespace status -} //namespace core -} //namespace dds - - -#endif //OMG_DDS_CORE_STATUS_STATE_HPP_ diff --git a/include/dds/core/status/Status.hpp b/include/dds/core/status/Status.hpp deleted file mode 100644 index 57171463ee3..00000000000 --- a/include/dds/core/status/Status.hpp +++ /dev/null @@ -1,449 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_STATUS_STATUS_HPP_ -#define OMG_DDS_CORE_STATUS_STATUS_HPP_ - -#include - -#include -#include -#include -#include - -#include - -namespace dds { -namespace core { -namespace status { - -/** - * \copydoc DCPS_Status_InconsistentTopic - */ -class InconsistentTopicStatus : public dds::core::Value -{ -public: - - OMG_DDS_API InconsistentTopicStatus(); - - /** - * @return Total cumulative count of all inconsistent topics detected. - */ - OMG_DDS_API int32_t total_count() const; - - /** - * @return The incremental number of inconsistent topics since the last time - * the listener was called or the status was read. - */ - OMG_DDS_API int32_t total_count_change() const; -}; - -/** - * \copydoc DCPS_Status_SampleLost - */ -class SampleLostStatus : public dds::core::Value -{ -public: - - OMG_DDS_API SampleLostStatus(); - - /** - * @return Total cumulative count of all samples lost across of instances of data - * published under the Topic. - */ - OMG_DDS_API int32_t total_count() const; - - /** - * @return The incremental number of samples lost since the last time the listener - * was called or the status was read. - */ - OMG_DDS_API int32_t total_count_change() const; -}; - - -/** - * \copydoc DCPS_Status_SampleRejected - */ -class SampleRejectedStatus : public dds::core::Value -{ -public: - - SampleRejectedStatus(); - - /** - * @return Total cumulative count of samples rejected by the DataReader. - */ - OMG_DDS_API int32_t total_count() const; - - /** - * @return The incremental number of samples rejected since the last time the - * listener was called or the status was read. - */ - OMG_DDS_API int32_t total_count_change() const; - - /** - * @return Reason for rejecting the last sample rejected. If no samples have been - * rejected, the reason is the special value NOT_REJECTED. - */ - OMG_DDS_API const dds::core::status::SampleRejectedState last_reason() const; - - /** - * @return Handle to the instance being updated by the last sample that was - * rejected. - */ - OMG_DDS_API const dds::core::InstanceHandle last_instance_handle() const; -}; - -/** - * \copydoc DCPS_Status_LivelinessLost - */ -class LivelinessLostStatus : public dds::core::Value -{ -public: - - OMG_DDS_API LivelinessLostStatus(); - - /** - * @return Total cumulative number of times that a previously-alive DataWriter - * became 'not alive' due to a failure to actively signal its liveliness within - * its offered liveliness period. This count does not change when an - * already not alive DataWriter simply remains not alive for another - * liveliness period. - */ - OMG_DDS_API int32_t total_count() const; - - /** - * @return The change in total_count since the last time the listener was called or - * the status was read. - */ - OMG_DDS_API int32_t total_count_change() const; -}; - -/** - * \copydoc DCPS_Status_LivelinessChanged - */ -class LivelinessChangedStatus : public dds::core::Value -{ -public: - - OMG_DDS_API LivelinessChangedStatus(); - - /** - * @return The total number of currently active DataWriters that write the Topic - * read by the DataReader. This count increases when a newly-matched - * DataWriter asserts its liveliness for the first time or when a DataWriter - * previously considered to be not alive reasserts its liveliness. The count - * decreases when a DataWriter considered alive fails to assert its - * liveliness and becomes not alive, whether because it was deleted - * normally or for some other reason. - */ - OMG_DDS_API int32_t alive_count() const; - - /** - * @return The total count of currently DataWriters that write the Topic read by - * the DataReader that are no longer asserting their liveliness. This count - * increases when a DataWriter considered alive fails to assert its - * liveliness and becomes not alive for some reason other than the normal - * deletion of that DataWriter. It decreases when a previously not alive - * DataWriter either reasserts its liveliness or is deleted normally. - */ - OMG_DDS_API int32_t not_alive_count() const; - - /** - * @return The change in the alive_count since the last time the listener was - * called or the status was read. - */ - OMG_DDS_API int32_t alive_count_change() const; - - /** - * @return The change in the not_alive_count since the last time the listener was - * called or the status was read. - */ - OMG_DDS_API int32_t not_alive_count_change() const; - - /** - * @return Handle to the last DataWriter whose change in liveliness caused this - * status to change. - */ - OMG_DDS_API const dds::core::InstanceHandle last_publication_handle() const; -}; - -/** - * \copydoc DCPS_Status_OfferedDeadlineMissed - */ -class OfferedDeadlineMissedStatus : public dds::core::Value -{ -public: - - OMG_DDS_API OfferedDeadlineMissedStatus(); - - /** - * @return Total cumulative number of offered deadline periods elapsed during - * which a DataWriter failed to provide data. Missed deadlines - * accumulate; that is, each deadline period the total_count will be - * incremented by one. - */ - OMG_DDS_API int32_t total_count() const; - - /** - * @return The change in total_count since the last time the listener was called or - * the status was read. - */ - OMG_DDS_API int32_t total_count_change() const; - - /** - * @return Handle to the last instance in the DataWriter for which an offered - * deadline was missed. - */ - OMG_DDS_API const dds::core::InstanceHandle last_instance_handle() const; -}; - -/** - * \copydoc DCPS_Status_RequestedDeadlineMissed - */ -class RequestedDeadlineMissedStatus : public dds::core::Value -{ -public: - - OMG_DDS_API RequestedDeadlineMissedStatus(); - - /** - * @return Total cumulative number of missed deadlines detected for any instance - * read by the DataReader. Missed deadlines accumulate; that is, each - * deadline period the total_count will be incremented by one for each - * instance for which data was not received. - */ - OMG_DDS_API int32_t total_count() const; - - /** - * @return The incremental number of deadlines detected since the last time the - * listener was called or the status was read. - */ - OMG_DDS_API int32_t total_count_change() const; - - /** - * @return Handle to the last instance in the DataReader for which a deadline was - * detected. - */ - OMG_DDS_API const dds::core::InstanceHandle last_instance_handle() const; -}; - - -/** - * \copydoc DCPS_Status_OfferedIncompatibleQoS - */ -class OfferedIncompatibleQosStatus : public dds::core::Value -{ -public: - - OMG_DDS_API OfferedIncompatibleQosStatus(); - - /** - * @return Total cumulative number of times the concerned DataWriter - * discovered a DataReader for the same Topic with a requested QoS that - * is incompatible with that offered by the DataWriter. - */ - OMG_DDS_API int32_t total_count() const; - - /** - * @return The change in total_count since the last time the listener was called or - * the status was read. - */ - OMG_DDS_API int32_t total_count_change() const; - - /** - * @return The PolicyId of one of the policies that was found to be - * incompatible the last time an incompatibility was detected. - */ - OMG_DDS_API dds::core::policy::QosPolicyId last_policy_id() const; - - /** - * @return A list containing for each policy the total number of times that the - * concerned DataWriter discovered a DataReader for the same Topic - * with a requested QoS that is incompatible with that offered by the - * DataWriter. - */ - OMG_DDS_API const dds::core::policy::QosPolicyCountSeq policies() const; - - /** - * @return A list containing for each policy the total number of times that the - * concerned DataWriter discovered a DataReader for the same Topic - * with a requested QoS that is incompatible with that offered by the - * DataWriter. - * - * @param dst The destination QosPolicyCountSeq the policies will be returned to - */ - OMG_DDS_API const dds::core::policy::QosPolicyCountSeq& policies( - dds::core::policy::QosPolicyCountSeq& dst) const; -}; - -/** - * \copydoc DCPS_Status_RequestedIncompatibleQoS - */ -class RequestedIncompatibleQosStatus : public dds::core::Value -{ -public: - - OMG_DDS_API RequestedIncompatibleQosStatus(); - - /** - * @return Total cumulative number of times the concerned DataReader - * discovered a DataWriter for the same Topic with an offered QoS that - * was incompatible with that requested by the DataReader. - */ - OMG_DDS_API int32_t total_count() const; - - /** - * @return The change in total_count since the last time the listener was called or - * the status was read. - */ - OMG_DDS_API int32_t total_count_change() const; - - /** - * @return The QosPolicyId of one of the policies that was found to be - * incompatible the last time an incompatibility was detected. - */ - OMG_DDS_API dds::core::policy::QosPolicyId last_policy_id() const; - - /** - * @return A list containing for each policy the total number of times that the - * concerned DataReader discovered a DataWriter for the same Topic - * with an offered QoS that is incompatible with that requested by the - * DataReader. - */ - OMG_DDS_API const dds::core::policy::QosPolicyCountSeq policies() const; - - /** - * @return A list containing for each policy the total number of times that the - * concerned DataReader discovered a DataWriter for the same Topic - * with an offered QoS that is incompatible with that requested by the - * DataReader. - * - * @param dst The destination QosPolicyCountSeq the policies will be returned to - */ - OMG_DDS_API const dds::core::policy::QosPolicyCountSeq& policies( - dds::core::policy::QosPolicyCountSeq& dst) const; -}; - -/** - * \copydoc DCPS_Status_PublicationMatched - */ -class PublicationMatchedStatus : public dds::core::Value -{ -public: - - OMG_DDS_API PublicationMatchedStatus(); - - /** - * @return Total cumulative count the concerned DataWriter discovered a - * "match" with a DataReader. That is, it found a DataReader for the - * same Topic with a requested QoS that is compatible with that offered - * by the DataWriter. - */ - OMG_DDS_API int32_t total_count() const; - - /** - * @return The change in total_count since the last time the listener was called or - * the status was read. - */ - OMG_DDS_API int32_t total_count_change() const; - - /** - * @return The number of DataReaders currently matched to the concerned - * DataWriter. - */ - OMG_DDS_API int32_t current_count() const; - - /** - * @return The change in current_count since the last time the listener was called - * or the status was read. - */ - OMG_DDS_API int32_t current_count_change() const; - - /** - * @return Handle to the last DataReader that matched the DataWriter causing the - * status to change. - */ - OMG_DDS_API const dds::core::InstanceHandle last_subscription_handle() const; -}; - -/** - * \copydoc DCPS_Status_SubscriptionMatched - */ -class SubscriptionMatchedStatus : public dds::core::Value -{ -public: - - OMG_DDS_API SubscriptionMatchedStatus(); - - /** - * @return Total cumulative count the concerned DataReader discovered a - * "match" with a DataWriter. That is, it found a DataWriter for the same - * Topic with a requested QoS that is compatible with that offered by the - * DataReader. - */ - OMG_DDS_API int32_t total_count() const; - - /** - * @return The change in total_count since the last time the listener was called or - * the status was read. - */ - OMG_DDS_API int32_t total_count_change() const; - - /** - * @return The number of DataWriters currently matched to the concerned - * DataReader. - */ - OMG_DDS_API int32_t current_count() const; - - /** - * @return The change in current_count since the last time the listener was called - * or the status was read. - */ - OMG_DDS_API int32_t current_count_change() const; - - /** - * @return Handle to the last DataWriter that matched the DataReader causing the - * status to change. - */ - OMG_DDS_API const dds::core::InstanceHandle last_publication_handle() const; -}; - - -class DataAvailableStatus -{ - // empty -}; - - -class DataOnReadersStatus -{ - // empty -}; - -// This trait is used to get the state associated with each status -template -StatusMask get_status(); - -} //namespace status -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_STATUS_STATUS_HPP_ diff --git a/include/dds/core/status/detail/Status.hpp b/include/dds/core/status/detail/Status.hpp deleted file mode 100644 index 8282d822af4..00000000000 --- a/include/dds/core/status/detail/Status.hpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_STATUS_DETAIL_STATUS_HPP_ -#define EPROSIMA_DDS_CORE_STATUS_DETAIL_STATUS_HPP_ - -#include -#include -#include -#include -#include -#include -#include - -/** - * @cond - * Ignore this file in the API - */ - -namespace dds { -namespace core { -namespace status { -namespace detail { - -using InconsistentTopicStatus = eprosima::fastdds::dds::InconsistentTopicStatus; - -using LivelinessChangedStatus = eprosima::fastdds::dds::LivelinessChangedStatus; - -using LivelinessLostStatus = eprosima::fastdds::dds::LivelinessLostStatus; - -using OfferedDeadlineMissedStatus = eprosima::fastdds::dds::OfferedDeadlineMissedStatus; - -using OfferedIncompatibleQosStatus = eprosima::fastdds::dds::OfferedIncompatibleQosStatus; - -using PublicationMatchedStatus = eprosima::fastdds::dds::PublicationMatchedStatus; - -using SampleRejectedStatus = eprosima::fastdds::dds::SampleRejectedStatus; - -using RequestedDeadlineMissedStatus = eprosima::fastdds::dds::RequestedDeadlineMissedStatus; - -using RequestedIncompatibleQosStatus = eprosima::fastdds::dds::RequestedIncompatibleQosStatus; - -using SampleLostStatus = eprosima::fastdds::dds::SampleLostStatus; - -using SubscriptionMatchedStatus = eprosima::fastdds::dds::SubscriptionMatchedStatus; - -} //namespace detail -} //namespace status -} //namespace core -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_CORE_STATUS_DETAIL_STATUS_HPP_ diff --git a/include/dds/core/status/detail/StatusImpl.hpp b/include/dds/core/status/detail/StatusImpl.hpp deleted file mode 100644 index c83ab09383a..00000000000 --- a/include/dds/core/status/detail/StatusImpl.hpp +++ /dev/null @@ -1,414 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_STATUS_TSTATUS_IMPL_HPP_ -#define EPROSIMA_DDS_CORE_STATUS_TSTATUS_IMPL_HPP_ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include - -namespace dds { -namespace core { -namespace status { - -//TInconsistentTopicStatus - -template -TInconsistentTopicStatus::TInconsistentTopicStatus() - : dds::core::Value() -{ -} - -template -int32_t TInconsistentTopicStatus::total_count() const -{ - //To implement - // return this->delegate().total_count(); -} - -template -int32_t TInconsistentTopicStatus::total_count_change() const -{ - //To implement - // return this->delegate().total_count_change(); -} - -//TSampleLostStatus - -template -TSampleLostStatus::TSampleLostStatus() - : dds::core::Value() -{ -} - -template -int32_t TSampleLostStatus::total_count() const -{ - //To implement - // return this->delegate().total_count(); -} - -template -int32_t TSampleLostStatus::total_count_change() const -{ - //To implement - // return this->delegate().total_count_change(); -} - -//TSampleRejectedStatus - -template -TSampleRejectedStatus::TSampleRejectedStatus() - : dds::core::Value() -{ -} - -template -int32_t TSampleRejectedStatus::total_count() const -{ - //To implement - // return this->delegate().total_count(); -} - -template -int32_t TSampleRejectedStatus::total_count_change() const -{ - //To implement - // return this->delegate().total_count_change(); -} - -template -const dds::core::status::SampleRejectedState TSampleRejectedStatus::last_reason() const -{ - //To implement - // return this->delegate().last_reason(); -} - -template -const dds::core::InstanceHandle TSampleRejectedStatus::last_instance_handle() const -{ - //To implement - // return this->delegate().last_instance_handle(); -} - -//TLivelinessLostStatus -template -TLivelinessLostStatus::TLivelinessLostStatus() - : dds::core::Value() -{ -} - -template -int32_t TLivelinessLostStatus::total_count() const -{ - //To implement - // return this->delegate().total_count(); -} - -template -int32_t TLivelinessLostStatus::total_count_change() const -{ - //To implement - // return this->delegate().total_count_change(); -} - -//TLivelinessChangedStatus - -template -TLivelinessChangedStatus::TLivelinessChangedStatus() - : dds::core::Value() -{ -} - -template -int32_t TLivelinessChangedStatus::alive_count() const -{ - //To implement - // return this->delegate().alive_count(); -} - -template -int32_t TLivelinessChangedStatus::not_alive_count() const -{ - //To implement - // return this->delegate().not_alive_count(); -} - -template -int32_t TLivelinessChangedStatus::alive_count_change() const -{ - //To implement - // return this->delegate().alive_count(); -} - -template -int32_t TLivelinessChangedStatus::not_alive_count_change() const -{ - //To implement - // return this->delegate().not_alive_count(); -} - -template -const dds::core::InstanceHandle TLivelinessChangedStatus::last_publication_handle() const -{ - //To implement - // return this->delegate().last_publication_handle(); -} - -//TOfferedDeadlineMissedStatus - -template -TOfferedDeadlineMissedStatus::TOfferedDeadlineMissedStatus() - : dds::core::Value() -{ -} - -template -int32_t TOfferedDeadlineMissedStatus::total_count() const -{ - //To implement - // return this->delegate().total_count(); -} - -template -int32_t TOfferedDeadlineMissedStatus::total_count_change() const -{ - //To implement - // return this->delegate().total_count_change(); -} - -template -const dds::core::InstanceHandle TOfferedDeadlineMissedStatus::last_instance_handle() const -{ - //To implement - // return this->delegate().last_instance_handle(); -} - -//TRequestedDeadlineMissedStatus - -template -TRequestedDeadlineMissedStatus::TRequestedDeadlineMissedStatus() - : dds::core::Value() -{ -} - -template -int32_t TRequestedDeadlineMissedStatus::total_count() const -{ - //To implement - // return this->delegate().total_count(); -} - -template -int32_t TRequestedDeadlineMissedStatus::total_count_change() const -{ - //To implement - // return this->delegate().total_count_change(); -} - -template -const dds::core::InstanceHandle TRequestedDeadlineMissedStatus::last_instance_handle() const -{ - //To implement - // return this->delegate().last_instance_handle(); -} - -//TOfferedIncompatibleQosStatus - -template -TOfferedIncompatibleQosStatus::TOfferedIncompatibleQosStatus() - : dds::core::Value() -{ -} - -template -int32_t TOfferedIncompatibleQosStatus::total_count() const -{ - //To implement - // return this->delegate().total_count(); -} - -template -int32_t TOfferedIncompatibleQosStatus::total_count_change() const -{ - //To implement - // return this->delegate().total_count_change(); -} - -template -dds::core::policy::QosPolicyId TOfferedIncompatibleQosStatus::last_policy_id() const -{ - //To implement - // return this->delegate().last_policy_id(); -} - -template -const dds::core::policy::QosPolicyCountSeq TOfferedIncompatibleQosStatus::policies() const -{ - //To implement - // return this->delegate().policies(); -} - -template -const dds::core::policy::QosPolicyCountSeq& TOfferedIncompatibleQosStatus::policies( - dds::core::policy::QosPolicyCountSeq& dst) const -{ - //To implement - // return this->delegate().policies(dst); -} - -//TRequestedIncompatibleQosStatus - -template -TRequestedIncompatibleQosStatus::TRequestedIncompatibleQosStatus() - : dds::core::Value() -{ -} - -template -int32_t TRequestedIncompatibleQosStatus::total_count() const -{ - //To implement - // return this->delegate().total_count(); -} - -template -int32_t TRequestedIncompatibleQosStatus::total_count_change() const -{ - //To implement - // return this->delegate().total_count_change(); -} - -template -dds::core::policy::QosPolicyId TRequestedIncompatibleQosStatus::last_policy_id() const -{ - //To implement - // return this->delegate().last_policy_id(); -} - -template -const dds::core::policy::QosPolicyCountSeq TRequestedIncompatibleQosStatus::policies() const -{ - //To implement - // return this->delegate().policies(); -} - -template -const dds::core::policy::QosPolicyCountSeq& TRequestedIncompatibleQosStatus::policies( - dds::core::policy::QosPolicyCountSeq& dst) const -{ - //To implement - // return this->delegate().policies(dst); -} - -//TPublicationMatchedStatus - -template -TPublicationMatchedStatus::TPublicationMatchedStatus() - : dds::core::Value() -{ -} - -template -int32_t TPublicationMatchedStatus::total_count() const -{ - //To implement - // return this->delegate().total_count(); -} - -template -int32_t TPublicationMatchedStatus::total_count_change() const -{ - //To implement - // return this->delegate().total_count_change(); -} - -template -int32_t TPublicationMatchedStatus::current_count() const -{ - //To implement - // return this->delegate().current_count(); -} - -template -int32_t TPublicationMatchedStatus::current_count_change() const -{ - //To implement - // return this->delegate().current_count_change(); -} - -template -const dds::core::InstanceHandle TPublicationMatchedStatus::last_subscription_handle() const -{ - //To implement - // return this->delegate().last_subscription_handle(); -} - -//TSubscriptionMatchedStatus - -template -TSubscriptionMatchedStatus::TSubscriptionMatchedStatus() - : dds::core::Value() -{ -} - -template -int32_t TSubscriptionMatchedStatus::total_count() const -{ - //To implement - // return this->delegate().total_count(); -} - -template -int32_t TSubscriptionMatchedStatus::total_count_change() const -{ - //To implement - // return this->delegate().total_count_change(); -} - -template -int32_t TSubscriptionMatchedStatus::current_count() const -{ - //To implement - // return this->delegate().current_count(); -} - -template -int32_t TSubscriptionMatchedStatus::current_count_change() const -{ - //To implement - // return this->delegate().current_count_change(); -} - -template -const dds::core::InstanceHandle TSubscriptionMatchedStatus::last_publication_handle() const -{ - //To implement - // return this->delegate().last_publication_handle(); -} - -} //namespace status -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_STATUS_TSTATUS_IMPL_HPP_ diff --git a/include/dds/core/types.hpp b/include/dds/core/types.hpp deleted file mode 100644 index 0f973ee8839..00000000000 --- a/include/dds/core/types.hpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_TYPES_HPP_ -#define OMG_DDS_CORE_TYPES_HPP_ - -#include -#include -#include - -#include -#include - -namespace dds { -namespace core { - -/** - * Use a std::vector to hold a sequence of bytes. - */ -typedef std::vector ByteSeq; - -/** - * Use a std::vector to hold a sequence of bytes. - */ -typedef std::vector StringSeq; - -/** - * @brief This class is used to create dds::core::null objects. - */ -class OMG_DDS_API null_type -{ -}; - -/** - * This is the DDS Null-Reference.
    - * A dds reference object that doesn't reference to anything can be compared with this object. - * @code{.cpp} - * dds::domain::DomainParticipant participant = dds::core::null; - * ... - * if (participant == dds::core::null) { - * // The participant is not yet properly created. - * // Using it now will trigger the dds::core::NullReferenceError exception. - * } - * @endcode - */ -extern const null_type OMG_DDS_API null; - -} //namespace core -} //namespace dds - -#endif // OMG_DDS_CORE_TYPES_HPP_ diff --git a/include/dds/core/xtypes/Annotation.hpp b/include/dds/core/xtypes/Annotation.hpp deleted file mode 100644 index 0cfa3c71730..00000000000 --- a/include/dds/core/xtypes/Annotation.hpp +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_XTYPES_ANNOTATION_HPP_ -#define OMG_DDS_CORE_XTYPES_ANNOTATION_HPP_ -#ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC - -#include -#include -#include -#include - -namespace dds { -namespace core { -namespace xtypes { - -template -class TIdAnnotation; - -template -class TAnnotation : public Reference -{ - - OMG_DDS_REF_TYPE_BASE( - TAnnotation, - dds::core::Reference, - DELEGATE) - -public: - - virtual ~TAnnotation(); - - TypeKind kind() const; - - template class K> - operator K&() - { - return reinterpret_cast&>(*this); - } - - const AnnotationKind& akind() const - { - return impl()->akind(); - } - -protected: - - TAnnotation( - const TypeKind& kind); -}; - -template -class TIdAnnotation : public TAnnotation -{ - using TAnnotation::impl; - -public: - - TIdAnnotation( - uint32_t id) - : TAnnotation(TypeKind::ANNOTATION_TYPE) - { - impl()->id(id); - } - - uint32_t id() const - { - return impl()->id(); - } - -}; - -template -class TKeyAnnotation : public TAnnotation -{ - using TAnnotation::impl; - -public: - - TKeyAnnotation() - { - } - -}; - -template -class TSharedAnnotation : public TAnnotation -{ -public: - - TSharedAnnotation() - { - } - -}; - -template -class TNestedAnnotation : public TAnnotation -{ -public: - - TNestedAnnotation() - { - } - -}; - -template -class TExtensibilityAnnotation : public TAnnotation -{ - using TAnnotation::impl; - -public: - - TExtensibilityAnnotation( - ExtensibilityKind xkind) - { - impl()->xKind(); - } - - ExtensibilityKind extensibility_kind() const - { - return impl()->xKind(); - } - -}; - -template -class TMustUnderstandAnnotation : public TAnnotation -{ -public: - - TMustUnderstandAnnotation() - { - } - -}; - -template -class TVerbatimAnnotation : public TAnnotation -{ - using TAnnotation::impl; - -public: - - TVerbatimAnnotation( - const std::string& text) - { - impl()->vbt(text); - } - - const std::string& verbatim_text() const - { - return impl()->vbt(); - } - -}; - -template -class TBitsetAnnotation : public TAnnotation -{ -public: - - TBitsetAnnotation() - { - } - -}; - -template -class TBitBoundAnnotation : public TAnnotation -{ - using TAnnotation::impl; - -public: - - TBitBoundAnnotation( - uint32_t bound) - { - impl()->bsb(bound); - } - - virtual uint32_t bound() const - { - return impl()->bsb(); - } - - void bound( - uint32_t bound) - { - impl()->bsb(bound); - } - -}; - -typedef TAnnotation Annotation; - -typedef TIdAnnotation IdAnnotation; - -typedef TKeyAnnotation KeyAnnotation; - -typedef TSharedAnnotation SharedAnnotation; - -typedef TNestedAnnotation NestedAnnotation; - -typedef TExtensibilityAnnotation ExtensibilityAnnotation; - -typedef TMustUnderstandAnnotation MustUnderstandAnnotation; - -typedef TVerbatimAnnotation VerbatimAnnotation; - -typedef TBitsetAnnotation BitsetAnnotation; - -typedef TBitBoundAnnotation BitBoundAnnotation; - -//FRANAVA We must think about the fact that previous API has a way of creating a -//dynamically defined Annotation. -/* - namespace converter - { - IdAnnotation convert(const Annotation& a) - { - uint32_t idav = reinterpret_cast(a).id(); - return IdAnnotation(idav); - } - } - */ -namespace annotation { - -// These functions can be used to get cached instances, -// to avoid the proliferation of small annotation objects. -IdAnnotation id( - uint32_t); - -KeyAnnotation key(); - -SharedAnnotation shared(); - -NestedAnnotation nested(); - -ExtensibilityAnnotation extensibility( - ExtensibilityKind kind); - -ExtensibilityAnnotation get_final(); - -ExtensibilityAnnotation extensible(); - -ExtensibilityAnnotation get_mutable(); - -MustUnderstandAnnotation must_understand(); - -VerbatimAnnotation verbatim( - const std::string& text); - -BitsetAnnotation bitset(); - -BitsetAnnotation bit_bound( - uint32_t bound); - -} //namespace annotation -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif -#endif //OMG_DDS_CORE_XTYPES_TANNOTATION_HPP_ diff --git a/include/dds/core/xtypes/AnnotationKind.hpp b/include/dds/core/xtypes/AnnotationKind.hpp deleted file mode 100644 index cd2f04cad65..00000000000 --- a/include/dds/core/xtypes/AnnotationKind.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef OMG_DDS_CORE_ANNOTATIONKIND_H -#define OMG_DDS_CORE_ANNOTATIONKIND_H - - -#include - -namespace dds { -namespace core { -namespace xtypes { - -struct AnnotationKind_def -{ - enum Type - { - ID_ANNOTATION_TYPE, - OPTIONAL_ANNOTATION_TYPE, - KEY_ANNOTATION_TYPE, - SHARED_ANNOTATION_TYPE, - NESTED_ANNOTATION_TYPE, - EXTENSIBILITY_ANNOTATION_TYPE, - MUST_UNDERSTAND_ANNOTATION_TYPE, - VERBATIM_ANNOTATION_TYPE, - BITSET_ANNOTATION_TYPE, - BITSETBOUND_ANNOTATION_TYPE - }; -}; - -typedef dds::core::SafeEnum AnnotationKind; - -struct ExtensibilityKind_def -{ - enum Type - { - FINAL, - EXTENSIBLE, - MUTABLE - }; -}; - -typedef dds::core::SafeEnum ExtensibilityKind; - -} //xtypes -} //core -} //dds - -#endif //OMG_DDS_CORE_ANNOTATIONKIND_H - diff --git a/include/dds/core/xtypes/CollectionTypes.hpp b/include/dds/core/xtypes/CollectionTypes.hpp deleted file mode 100644 index 4efc50d4ae4..00000000000 --- a/include/dds/core/xtypes/CollectionTypes.hpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_XTYPES_COLLECTION_TYPES_HPP_ -#define OMG_DDS_CORE_XTYPES_COLLECTION_TYPES_HPP_ - -#include -#include - -namespace dds { -namespace core { -namespace xtypes { - - -template -class TCollectionType : public TDynamicType -{ -public: - - constexpr static uint32_t UNBOUNDED = 0xFFFFFFFF; - - uint32_t bounds() const - { - throw "Not implemented"; - } - -protected: - - TCollectionType( - const std::string& name, - TypeKind kind) - { - throw "Not implemented"; - } - -}; - -template< - typename DELEGATE, - typename DELEGATE_K, - typename DELEGATE_V> -class TMapType : public TCollectionType -{ -public: - - TMapType( - const TDynamicType& key_type, - const TDynamicType& value_type) - { - throw "Not implemented"; - } - - TMapType( - const TDynamicType& key_type, - const TDynamicType& value_type, - uint32_t bounds) - { - throw "Not implemented"; - } - - const TDynamicType& key_type() - { - throw "Not implemented"; - } - - const TDynamicType& value_type() - { - throw "Not implemented"; - } - -}; - - -template< - typename DELEGATE, - typename DELEGATE_T> -class TSequenceType : public TCollectionType -{ -public: - - TSequenceType( - const TDynamicType& type) - { - throw "Not implemented"; - } - - TSequenceType( - const TDynamicType& type, - uint32_t bounds) - { - throw "Not implemented"; - } - -public: - - const TDynamicType& key_type() const - { - throw "Not implemented"; - } - -}; - - -template -class TStringType : public TCollectionType -{ -public: - - TStringType( - uint32_t bounds) - { - throw "Not implemented"; - } - -}; - -typedef TCollectionType CollectionType; -typedef TMapType TypeMap; -typedef TSequenceType SequenceType; -typedef TStringType StringType; - -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_XTYPES_COLLECTION_TYPES_HPP_ diff --git a/include/dds/core/xtypes/DynamicData.hpp b/include/dds/core/xtypes/DynamicData.hpp deleted file mode 100644 index d18b6241883..00000000000 --- a/include/dds/core/xtypes/DynamicData.hpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_XTYPES_DYNAMIC_DATA_HPP_ -#define OMG_DDS_CORE_XTYPES_DYNAMIC_DATA_HPP_ - -#include - -#include -#include - -#include - -namespace dds { -namespace core { -namespace xtypes { - -/** - * This class is used to read/write data for DynamicTypes. It allows reading and - * writing of samples in a type-safe manner but without any compile-time knowledge - * of the type being read or written. - */ -template< - typename DELEGATE, - typename DELEGATE_TYPE> -class TDynamicData : Reference -{ - OMG_DDS_REF_TYPE_PROTECTED_DC( - TDynamicData, - Reference, - DELEGATE) - -public: - - TDynamicData( - const TDynamicType& type) - { - throw "Not implemented"; - } - - template - void value( - uint32_t mid, - const T& v) const - { - throw "Not implemented"; - } - - template - T value( - const std::string& mid, - const T& v) const - { - throw "Not implemented"; - } - - template - T value( - uint32_t mid) const - { - throw "Not implemented"; - } - - template - T value( - const std::string& mid) const - { - throw "Not implemented"; - } - - TDynamicType type() const - { - throw "Not implemented"; - } - - MemberType member_type( - uint32_t id) const - { - throw "Not implemented"; - } - - MemberType member_type( - const std::string& name) const - { - throw "Not implemented"; - } - - uint32_t member_id( - const std::string& name) const - { - throw "Not implemented"; - } - -}; - -typedef TDynamicData DynamicData; - -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_XTYPES_DYNAMIC_DATA_HPP_ diff --git a/include/dds/core/xtypes/DynamicType.hpp b/include/dds/core/xtypes/DynamicType.hpp deleted file mode 100644 index 8a90e572957..00000000000 --- a/include/dds/core/xtypes/DynamicType.hpp +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_XTYPES_DYNAMIC_TYPE_HPP_ -#define OMG_DDS_CORE_XTYPES_DYNAMIC_TYPE_HPP_ - -#include - -#include -#include - -namespace dds { -namespace core { -namespace xtypes { - -template -class TDynamicType : public Reference -{ - OMG_DDS_REF_TYPE_PROTECTED_DC( - TDynamicType, - Reference, - DELEGATE) - -public: - - const std::string& name() const - { - return impl()->name(); - } - - TypeKind kind() const - { - return impl()->kind(); - } - - const std::vector& annotations() const - { - return impl()->annotations(); - } - - bool operator ==( - const TDynamicType& that) const - { - return *(impl()) == *(that.impl()); - } - - bool operator !=( - const TDynamicType& that) const - { - return !(*this == that); - } - - bool is_primitive_type() - { - return (impl()->kind().underlying() & 0x4000 ) != 0; - } - - bool is_collection_type() - { - return (impl()->kind().underlying() & 0x0200 ) != 0; - } - - bool is_aggregation_type() - { - return (impl()->kind().underlying() & 0x0100 ) != 0; - } - - bool is_constructed_type() - { - return (impl()->kind().underlying() & 0x8000 ) != 0; - } - -protected: - - TDynamicType( - const std::string& name, - TypeKind kind) - { - impl()->name(name); - impl()->kind(kind); - } - - TDynamicType( - const std::string& name, - TypeKind kind, - const Annotation& annotation) - { - impl()->name(name); - impl()->kind(kind); - impl()->annotation(annotation); - } - - TDynamicType( - const std::string& name, - TypeKind kind, - const std::vector& annotations) - { - impl()->name(name); - impl()->kind(kind); - impl()->annotation(annotations); - } - - template - TDynamicType( - const std::string& name, - TypeKind kind, - const AnnotationIter& begin, - const AnnotationIter& end) - { - impl()->name(name); - impl()->kind(kind); - impl()->annotation(begin, end); - } - -public: - - TDynamicType( - const TDynamicType& other) = default; -}; - -template -bool is_primitive_type( - const TDynamicType& t) -{ - return t.is_primitive_type(); -} - -template -bool is_constructed_type( - const TDynamicType& t) -{ - return t.is_constructed_type(); -} - -template -bool is_collection_type( - const TDynamicType& t) -{ - return t.is_collection_type(); -} - -template -bool is_aggregation_type( - const TDynamicType& t) -{ - return t.is_aggregation_type(); -} - -typedef TDynamicType DynamicType; - -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_XTYPES_DYNAMIC_TYPE_HPP_ diff --git a/include/dds/core/xtypes/MemberType.hpp b/include/dds/core/xtypes/MemberType.hpp deleted file mode 100644 index 5b3815c4fda..00000000000 --- a/include/dds/core/xtypes/MemberType.hpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_XTYPES_MEMBER_TYPE_HPP -#define OMG_DDS_CORE_XTYPES_MEMBER_TYPE_HPP - -#include -#include - -#include -#include - - - -namespace dds { -namespace core { -namespace xtypes { - -template< - typename DELEGATE, - typename OTHER_DELEGATE> -class TMemberType : public Reference -{ - OMG_DDS_REF_TYPE_PROTECTED_DC( - TMemberType, - Reference, - DELEGATE) - -public: - - TMemberType( - const std::string& name, - const TDynamicType& type) - { - impl()->name(name); - impl()->dt(type); - } - - TMemberType( - const std::string& name, - const xtypes::DynamicType& type, - const Annotation& annotation) - { - impl()->name(name); - impl()->dt(type); - impl()->annotation(annotation); - } - - TMemberType( - const std::string& name, - const TDynamicType& type, - const std::vector& annotations) - { - impl()->name(name); - impl()->dt(type); - impl()->annotation(annotations); - } - - template - TMemberType( - const std::string& name, - const TDynamicType& type, - const AnnotationIter& begin, - const AnnotationIter& end) - { - impl()->name(name); - impl()->dt(type); - impl()->annotation(begin, end); - } - - const std::string& name() const - { - return impl()->name(); - } - - const TDynamicType& type() const - { - return impl()->dt(); - } - - TMemberType add_annotation( - const Annotation& annotation) - { - impl()->annotation(annotation); - return *this; - } - - TMemberType remove_annotation( - const Annotation& annotation) - { - impl().remove_annotation(annotation); - return *this; - } - - bool is_optional() const - { - return impl()->is_optional(); - } - - bool is_shared() const - { - return impl()->is_shared(); - } - - bool is_key() const - { - return impl()->is_key(); - } - - bool is_must_understand() const - { - return impl()->is_must_understand(); - } - - bool is_bitset() const - { - return impl()->is_bitset(); - } - - bool has_bitbound() const - { - return impl()->has_bitbound(); - } - - uint32_t get_bitbound() const - { - return impl()->get_bitbound(); - } - - bool has_id() const - { - return impl()->has_id(); - } - - uint32_t get_id() const - { - return impl()->get_bitbound(); - } - -}; - -typedef TMemberType MemberType; -typedef MemberType Member; - -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_XTYPES_MEMBER_TYPE_HPP diff --git a/include/dds/core/xtypes/PrimitiveTypes.hpp b/include/dds/core/xtypes/PrimitiveTypes.hpp deleted file mode 100644 index 5eeb634a2f9..00000000000 --- a/include/dds/core/xtypes/PrimitiveTypes.hpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_XTYPES_PRIMITIVE_TYPES_HPP_ -#define OMG_DDS_CORE_XTYPES_PRIMITIVE_TYPES_HPP_ - -#include -#include - -namespace dds { -namespace core { -namespace xtypes { - -template -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::NO_TYPE; - static constexpr const char* const NAME = "no_type"; -}; - -template< - typename T, - typename DELEGATE> -class TPrimitiveType : public TDynamicType -{ -public: - - TPrimitiveType() - : TDynamicType( - dynamic_type_traits::NAME, - dynamic_type_traits::TYPE_ID) - { - } - -}; - - -/** - * Primitive type constructor. This function can be used - * as follows: - * - * DynamicType int16Type = primitive_type(); - */ -template -TPrimitiveType primitive_type() -{ - throw "Not implemented"; -} - -} //namespace xtypes -} //namespace core -} //namespace dds - -// This include should be at the end since it provides -// template specializations. -#include - -#endif //OMG_DDS_CORE_XTYPES_PRIMITIVE_TYPES_HPP_ diff --git a/include/dds/core/xtypes/StructType.hpp b/include/dds/core/xtypes/StructType.hpp deleted file mode 100644 index da61706f918..00000000000 --- a/include/dds/core/xtypes/StructType.hpp +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_XTYPES_STRUCT_TYPE_HPP_ -#define OMG_DDS_CORE_XTYPES_STRUCT_TYPE_HPP_ - -#include - -#include -#include - -namespace dds { -namespace core { -namespace xtypes { - -template -class TStructForwardDeclaration : public TDynamicType -{ -public: - - TStructForwardDeclaration( - const std::string& name) - { - throw "Not implemented"; - } - -}; - -/** - * Create a dynamic structure type. If the members don't have Id associated - * explicitly, then their ID will be the same as the ordinal position on the - * members vector. - */ -template -class TStructType : public TDynamicType -{ - - TStructType& parent_ts_; - -public: - - explicit TStructType( - const std::string& name) - { - throw "Not implemented"; - } - - TStructType( - const std::string& name, - const std::vector& members) - { - TDynamicType::impl()->name(name); - } - - TStructType( - const std::string& name, - const TStructType& parent, - const std::vector& members) - { - TDynamicType::impl()->name(name); - parent_ts_ = parent; - TDynamicType::impl()->members(members); - } - - template - TStructType( - const std::string& name, - const TStructType& parent, - const MemberIter& begin, - const MemberIter& end) - { - TDynamicType::impl()->name(name); - parent_ts_ = parent; - TDynamicType::impl()->members(begin, end); - } - - TStructType( - const std::string& name, - const TStructType& parent, - const std::vector& members, - const Annotation& annotation) - { - TDynamicType::impl()->name(name); - parent_ts_ = parent; - TDynamicType::impl()->members(members); - TDynamicType::impl()->annotation(annotation); - } - - TStructType( - const std::string& name, - const TStructType& parent, - const std::vector& members, - const std::vector& annotations) - { - TDynamicType::impl()->name(name); - parent_ts_ = parent; - TDynamicType::impl()->members(members); - TDynamicType::impl()->annotations(annotations); - } - - template< - typename AnnotationIter, - typename MemberIter> - TStructType( - const std::string& name, - const TStructType& parent, - const MemberIter& member_begin, - const MemberIter& member_end, - const AnnotationIter& annotation_begin, - const AnnotationIter& annotation_end) - { - TDynamicType::impl()->name(name); - parent_ts_ = parent; - TDynamicType::impl()->members(member_begin, member_end); - TDynamicType::impl()->annotations(annotation_begin, annotation_end); - } - - template - operator TDynamicType() const - { - throw "Not implemented"; - } - - TStructType parent() const - { - return parent_ts_; - } - - const std::vector& members() const - { - return TDynamicType::impl()->members(); - } - - const MemberType& member( - uint32_t id) const - { - return TDynamicType::impl()->member(id); - } - - const MemberType& member( - const std::string& name) const - { - return TDynamicType::impl()->member(name); - } - - const std::vector& annotations() const - { - return TDynamicType::impl()->annotations(); - } - - TStructType add_member( - const MemberType& member) const - { - TDynamicType::impl()->member(member); - return *this; - } - - TStructType remove_member( - const MemberType& member) const - { - TDynamicType::impl()->remove_member(); - return *this; - } - - TStructType add_annotation( - const Annotation& annotation) const - { - TDynamicType::impl()->annotation(annotation); - return *this; - } - - TStructType remove_annotation( - const Annotation& annotation) const - { - TDynamicType::impl()->remove_annotation(annotation); - return *this; - } - -}; - -typedef TStructType StructType; - -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_XTYPES_STRUCT_TYPE_HPP_ diff --git a/include/dds/core/xtypes/TypeKind.hpp b/include/dds/core/xtypes/TypeKind.hpp deleted file mode 100644 index bea53d35bc4..00000000000 --- a/include/dds/core/xtypes/TypeKind.hpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_XTYPES_TYPE_KIND_HPP_ -#define OMG_DDS_XTYPES_TYPE_KIND_HPP_ - -#include -#include - -#include - -#if defined(OMG_DDS_X_TYPES_DYNAMIC_TYPE_SUPPORT) - -namespace dds { -namespace core { -namespace xtypes { - -enum class TypeKind -{ - NO_TYPE = 0, // sentinel indicating "null" value - PRIMITIVE_TYPE = 0x4000, - CONSTRUCTED_TYPE = 0x8000, - COLLECTION_TYPE = 0x0200, - AGGREGATION_TYPE = 0x0100, - ANNOTATION_TYPE = 0x0080, - - BOOLEAN_TYPE = PRIMITIVE_TYPE | 0x0001, - UINT_8_TYPE = PRIMITIVE_TYPE | 0x0002, - INT_16_TYPE = PRIMITIVE_TYPE | 0x0003, - UINT_16_TYPE = PRIMITIVE_TYPE | 0x0004, - INT_32_TYPE = PRIMITIVE_TYPE | 0x0005, - UINT_32_TYPE = PRIMITIVE_TYPE | 0x0006, - INT_64_TYPE = PRIMITIVE_TYPE | 0x0007, - UINT_64_TYPE = PRIMITIVE_TYPE | 0x0008, - FLOAT_32_TYPE = PRIMITIVE_TYPE | 0x0009, - FLOAT_64_TYPE = PRIMITIVE_TYPE | 0x000A, - FLOAT_128_TYPE = PRIMITIVE_TYPE | 0x000B, - CHAR_8_TYPE = PRIMITIVE_TYPE | 0x000C, - CHAR_32_TYPE = PRIMITIVE_TYPE | 0x000D, - - ENUMERATION_TYPE = CONSTRUCTED_TYPE | 0x0001, - BITSET_TYPE = CONSTRUCTED_TYPE | 0x0002, - ALIAS_TYPE = CONSTRUCTED_TYPE | 0x0003, - - ARRAY_TYPE = CONSTRUCTED_TYPE | COLLECTION_TYPE | 0x0004, - SEQUENCE_TYPE = CONSTRUCTED_TYPE | COLLECTION_TYPE | 0x0005, - STRING_TYPE = CONSTRUCTED_TYPE | COLLECTION_TYPE | 0x0006, - MAP_TYPE = CONSTRUCTED_TYPE | COLLECTION_TYPE | 0x0007, - - UNION_TYPE = CONSTRUCTED_TYPE | AGGREGATION_TYPE | 0x0008, - STRUCTURE_TYPE = CONSTRUCTED_TYPE | AGGREGATION_TYPE | 0x0009, - UNION_FWD_DECL_TYPE = CONSTRUCTED_TYPE | AGGREGATION_TYPE | 0x000A, - STRUCTURE_FWD_DECL_TYPE = CONSTRUCTED_TYPE | AGGREGATION_TYPE | 0x000B -}; - -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //OMG_DDS_X_TYPES_DYNAMIC_TYPE_SUPPORT - -#endif //OMG_DDS_XTYPES_TYPE_KIND_HPP_ - diff --git a/include/dds/core/xtypes/TypeProvider.hpp b/include/dds/core/xtypes/TypeProvider.hpp deleted file mode 100644 index 81542677af9..00000000000 --- a/include/dds/core/xtypes/TypeProvider.hpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_XTYPES_TYPE_PROVIDER_HPP_ -#define OMG_DDS_CORE_XTYPES_TYPE_PROVIDER_HPP_ - -#include - -#include - -namespace dds { -namespace core { -namespace xtypes { - -/** - * TypeProvider that allows creation of types from external representations. - */ -template -class TTypeProvider -{ -public: - - /** - * Load a type from the specified URI. If multiple types are defined - * only the first one is returned. - */ - static TDynamicType load_type( - const std::string& uri) - { - throw "Not implemented"; - } - - /** - * Load a type from the specified URI. If multiple types are defined - * only the first one is returned. - */ - static std::vector > load_types( - const std::string& uri) - { - throw "Not implemented"; - } - - /** - * Load a named type from the specified URI. - */ - static TDynamicType load_type( - const std::string& uri, - const std::string& name) - { - throw "Not implemented"; - } - -}; - -typedef TTypeProvider TypeProvider; - -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_XTYPES_TYPE_PROVIDER_HPP_ diff --git a/include/dds/core/xtypes/UnionCase.hpp b/include/dds/core/xtypes/UnionCase.hpp deleted file mode 100644 index 75d682041a6..00000000000 --- a/include/dds/core/xtypes/UnionCase.hpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_XTYPES_UNION_CASE_HPP_ -#define OMG_DDS_CORE_XTYPES_UNION_CASE_HPP_ - -#include -#include - -#include - -namespace dds { -namespace core { -namespace xtypes { - -template< - typename T, - template class DELEGATE> -class TUnionCase : public Reference< DELEGATE > -{ -public: - - TUnionCase() - { - } - - TUnionCase( - T discriminator, - const MemberType& member) - { - throw "Not implemented"; - } - - T discriminator() - { - throw "Not implemented"; - } - - const MemberType& member() - { - throw "Not implemented"; - } - -}; - -template -struct UnionCase : public TUnionCase {}; - -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_XTYPES_T_UNION_CASE_HPP_ diff --git a/include/dds/core/xtypes/UnionType.hpp b/include/dds/core/xtypes/UnionType.hpp deleted file mode 100644 index 88d1170914f..00000000000 --- a/include/dds/core/xtypes/UnionType.hpp +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_CORE_XTYPES_T_UNION_TYPE_HPP_ -#define OMG_DDS_CORE_XTYPES_T_UNION_TYPE_HPP_ - -#include - -#include -#include -#include - -#include - -namespace dds { -namespace core { -namespace xtypes { - -/** - * Declares a forward declaration for a union type. - */ -template -class TUnionForwardDeclaration : public TDynamicType -{ -public: - - TUnionForwardDeclaration( - const std::string& name) - { - throw "Not implemented"; - } - -}; - -template< - typename T, - template class DELEGATE> -class TUnionType : public TDynamicType > -{ -public: - - TUnionType( - const std::string& name, - const TPrimitiveType >& discriminator_type, - const std::vector >& cases) - { - throw "Not implemented"; - } - - TUnionType( - const std::string& name, - const TPrimitiveType >& discriminator_type, - const std::vector >& cases, - const Annotation& annotation) - { - throw "Not implemented"; - } - - TUnionType( - const std::string& name, - const TPrimitiveType >& discriminator_type, - const std::vector >& cases, - const std::vector& annotations) - { - throw "Not implemented"; - } - - const std::vector >& members() const - { - throw "Not implemented"; - } - - const MemberType& member( - uint32_t id) const - { - throw "Not implemented"; - } - - const MemberType& member( - const std::string& name) const - { - throw "Not implemented"; - } - - const std::vector& annotations() const - { - throw "Not implemented"; - } - - TUnionType add_member( - const UnionCase& member) const - { - throw "Not implemented"; - } - - TUnionType remove_member( - const UnionCase& member) const - { - throw "Not implemented"; - } - - TUnionType add_annotation( - const Annotation& annotation) const - { - throw "Not implemented"; - } - - TUnionType remove_annotation( - const Annotation& annotation) const - { - throw "Not implemented"; - } - -}; - -template -class UnionType : public TUnionType -{ -}; - -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //OMG_DDS_CORE_XTYPES_T_STRUCT_TYPE_HPP_ diff --git a/include/dds/core/xtypes/detail/Annotation.hpp b/include/dds/core/xtypes/detail/Annotation.hpp deleted file mode 100644 index a7a4e0515b6..00000000000 --- a/include/dds/core/xtypes/detail/Annotation.hpp +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_XTYPES_DETAIL_ANNOTATION_HPP_ -#define EPROSIMA_DDS_CORE_XTYPES_DETAIL_ANNOTATION_HPP_ -#include -#include -#include - -namespace dds { -namespace core { -namespace xtypes { -namespace detail { - -class Annotation -{ -public: - - Annotation( - AnnotationKind ak) - : ak_(ak) - { - } - - const AnnotationKind& akind() - { - return ak_; - } - -private: - - AnnotationKind ak_; -}; - -class IdAnnotation : public Annotation -{ -public: - - IdAnnotation() - : Annotation(AnnotationKind::OPTIONAL_ANNOTATION_TYPE) - , id_() - { - } - - void id( - uint32_t id ) - { - id_ = id; - } - - uint32_t id() const noexcept - { - return id_; - } - - template class K> - operator K&() - { - return reinterpret_cast&>(*this); - } - - IdAnnotation( - Annotation& a) - : Annotation(AnnotationKind::ID_ANNOTATION_TYPE) - , id_(static_cast(a).id()) - { - } - -private: - - uint32_t id_; -}; - -class KeyAnnotation : public Annotation -{ -public: - - KeyAnnotation() - : Annotation(AnnotationKind::KEY_ANNOTATION_TYPE) - { - } - -}; - -class SharedAnnotation : public Annotation -{ -public: - - SharedAnnotation() - : Annotation(AnnotationKind::SHARED_ANNOTATION_TYPE) - { - } - -}; - -class NestedAnnotation : public Annotation -{ -public: - - NestedAnnotation() - : Annotation(AnnotationKind::NESTED_ANNOTATION_TYPE) - { - } - -}; - -class ExtensibilityAnnotation : public Annotation -{ -public: - - ExtensibilityAnnotation( - ExtensibilityKind xkind) - : Annotation(AnnotationKind::EXTENSIBILITY_ANNOTATION_TYPE) - , xk_(xkind) - { - } - - const ExtensibilityKind& xKind() const noexcept - { - return xk_; - } - - void xKind( - ExtensibilityKind xk) - { - xk_ = xk; - } - -private: - - ExtensibilityKind xk_; - -}; - -class MustUnderstandAnnotation : public Annotation -{ - MustUnderstandAnnotation() - : Annotation(AnnotationKind::MUST_UNDERSTAND_ANNOTATION_TYPE) - { - } - -}; - -class VerbatimAnnotation : public Annotation -{ -public: - - VerbatimAnnotation( - const std::string& vbt) - : Annotation(AnnotationKind::VERBATIM_ANNOTATION_TYPE) - , vbt_(vbt) - { - } - - void vbt( - const std::string& vbt) - { - vbt_ = vbt; - } - - const std::string& vbt() const noexcept - { - return vbt_; - } - -private: - - std::string vbt_; -}; - - -class BitsetAnnotation : public Annotation -{ - BitsetAnnotation() - : Annotation(AnnotationKind::BITSET_ANNOTATION_TYPE) - { - } - -}; - -class BitBoundAnnotation : public Annotation -{ - BitBoundAnnotation( - uint32_t bsb ) - : Annotation(AnnotationKind::BITSETBOUND_ANNOTATION_TYPE) - , bsb_(bsb) - { - } - - uint32_t bsb() const noexcept - { - return bsb_; - } - - void bsb( - uint32_t bsb) - { - bsb_ = bsb; - } - -private: - - uint32_t bsb_; -}; - -} //namespace detail -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_XTYPES_DETAIL_ANNOTATION_HPP_ diff --git a/include/dds/core/xtypes/detail/CollectionTypes.hpp b/include/dds/core/xtypes/detail/CollectionTypes.hpp deleted file mode 100644 index c7fa286a3fe..00000000000 --- a/include/dds/core/xtypes/detail/CollectionTypes.hpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_XTYPES_DETAIL_COLLECTION_TYPES_HPP_ -#define EPROSIMA_DDS_CORE_XTYPES_DETAIL_COLLECTION_TYPES_HPP_ - -#include - -namespace dds { -namespace core { -namespace xtypes { -namespace detail { - -class CollectionType : public DynamicType -{ -}; -class MapType : public CollectionType -{ -}; -class SequenceType : public CollectionType -{ -}; -class StringType : public CollectionType -{ -}; - -} //namespace detail -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_XTYPES_DETAIL_COLLECTION_TYPES_HPP_ - diff --git a/include/dds/core/xtypes/detail/DynamicData.hpp b/include/dds/core/xtypes/detail/DynamicData.hpp deleted file mode 100644 index accccbce86a..00000000000 --- a/include/dds/core/xtypes/detail/DynamicData.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_XTYPES_DETAIL_DYNAMICDATA_HPP_ -#define EPROSIMA_DDS_CORE_XTYPES_DETAIL_DYNAMICDATA_HPP_ - -namespace dds { -namespace core { -namespace xtypes { -namespace detail { - -class DynamicData -{ -}; - -} //namespace detail -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_XTYPES_DETAIL_DYNAMICDATA_HPP_ diff --git a/include/dds/core/xtypes/detail/DynamicType.hpp b/include/dds/core/xtypes/detail/DynamicType.hpp deleted file mode 100644 index 13eca3b1024..00000000000 --- a/include/dds/core/xtypes/detail/DynamicType.hpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef EPROSIMA_DDS_CORE_XTYPES_DETAIL_DYNAMIC_TYPE_HPP_ -#define EPROSIMA_DDS_CORE_XTYPES_DETAIL_DYNAMIC_TYPE_HPP_ - -#include -#include -#include -#include - -namespace dds { -namespace core { -namespace xtypes { -namespace detail { - -class DynamicType -{ -public: - - const std::string& name() const noexcept - { - return name_; - } - - const TypeKind& kind() const noexcept - { - return kind_; - } - - void name( - const std::string& name) - { - name_ = name; - } - - void kind( - const TypeKind& kind) - { - kind_ = kind; - } - - void annotation( - xtypes::Annotation& a) - { - ann_.push_back(a); - } - - void annotation( - const std::vector& annotations) - { - ann_.reserve(annotations.size() + ann_.size()); - for (auto it = annotations.begin(); it != annotations.end(); ++it) - { - ann_.emplace_back(*it); - } - } - - template - void annotation( - AnnoIter begin, - AnnoIter end) - { - ann_.reserve(ann_.size() + ( end - begin) ); - for (auto it = begin; it != end; ++it) - { - ann_.emplace_back(*it); - } - } - - const std::vector& annotations() const - { - return ann_; - } - -private: - - std::string name_; - TypeKind kind_; - std::vector ann_; -}; - -} //namespace detail -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_XTYPES_DETAIL_DYNAMIC_TYPE_HPP_ diff --git a/include/dds/core/xtypes/detail/MemberType.hpp b/include/dds/core/xtypes/detail/MemberType.hpp deleted file mode 100644 index df02f4d6884..00000000000 --- a/include/dds/core/xtypes/detail/MemberType.hpp +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_XTYPES_DETAIL_MEMBER_TYPE_HPP_ -#define EPROSIMA_DDS_CORE_XTYPES_DETAIL_MEMBER_TYPE_HPP_ - -#include -#include - -#include -#include -#include - -namespace dds { -namespace core { -namespace xtypes { -namespace detail { - -class MemberType -{ -public: - - MemberType( - const std::string& name, - xtypes::DynamicType& dt) - : name_(name) -#if (0) - , dt_(dt.name(), dt.kind(), dt.annotations()) -#else - , dt_(dt) -#endif - , ann_() - { - } - - MemberType( - const std::string& name, - xtypes::DynamicType& dt, - xtypes::Annotation& a) - : name_(name) - , dt_(dt) - , ann_() - { - ann_.push_back(a); - } - - void name( - const std::string& name) - { - name_ = name; - } - - void dt( - const xtypes::DynamicType& dt) - { - dt_ = dt; - } - - void annotations( - std::vector& ann) - { - ann_.reserve(ann.size() + ann_.size()); - for (auto it = ann.begin(); it != ann.end(); ++it) - { - ann_.emplace_back(*it); - } - } - - template - void annotations( - AnnoIter begin, - AnnoIter end) - { - ann_.reserve(ann_.size() + ( end - begin) ); - for (auto it = begin; it != end; ++it) - { - ann_.emplace_back(*it); - } - } - - void annotation( - xtypes::Annotation& ann) - { - ann_.push_back(ann); - } - - const std::string& name() const noexcept - { - return name_; - } - - const xtypes::DynamicType& dynamic_type() const noexcept - { - return dt_; - } - - const std::vector& annotations() - { - return ann_; - } - - void remove_annotation( - const xtypes::Annotation& a) - { - auto rem = std::find_if( - ann_.begin(), - ann_.end(), - [&]( xtypes::Annotation& b) - { - return b.akind() == a.akind(); - } - ); - if ( rem != ann_.end() ) - { - ann_.erase(rem); - } - } - - bool annotation_iterator( - AnnotationKind& annotation_kind, - xtypes::Annotation& retAnn) - { - auto retVal = std::find_if( - ann_.begin(), - ann_.end(), - [&]( xtypes::Annotation& a) - { - return (a.akind() == annotation_kind); - } - ); - - if (retVal == ann_.end()) - { - return false; - } - retAnn = *retVal; - return true; - } - - bool find_annotation( - AnnotationKind& annotation_kind) - { - return ann_.end() != std::find_if( - ann_.begin(), - ann_.end(), - [&]( xtypes::Annotation& a) - { - return (a.akind() == annotation_kind); - } - ); - } - - bool is_optional() - { - AnnotationKind a = AnnotationKind_def::Type::OPTIONAL_ANNOTATION_TYPE; - return find_annotation(a); - } - - bool is_shared() - { - AnnotationKind a = AnnotationKind_def::Type::SHARED_ANNOTATION_TYPE; - return find_annotation(a); - } - - bool is_key() - { - AnnotationKind a = AnnotationKind_def::Type::KEY_ANNOTATION_TYPE; - return find_annotation(a); - } - - bool is_must_understand() - { - AnnotationKind a = AnnotationKind_def::Type::MUST_UNDERSTAND_ANNOTATION_TYPE; - return find_annotation(a); - } - - bool is_bitset() - { - AnnotationKind a = AnnotationKind_def::Type::BITSET_ANNOTATION_TYPE; - return find_annotation(a); - } - - bool has_bitbound() - { - AnnotationKind a = AnnotationKind_def::Type::BITSETBOUND_ANNOTATION_TYPE; - return find_annotation(a); - } - - /* - uint32_t get_bitbound() - { - if(false == has_bitbound()) - { - throw IllegalOperationError("No Bitsetbound Annotation found"); - } - AnnotationKind a = AnnotationKind_def::Type::BITSETBOUND_ANNOTATION_TYPE; - return annIt(a)->bound(); - } - */ - bool has_id() - { - AnnotationKind a = AnnotationKind_def::Type::ID_ANNOTATION_TYPE; - return find_annotation(a); - } - - uint32_t get_id() - { - AnnotationKind a = AnnotationKind_def::Type::ID_ANNOTATION_TYPE; - - // creting a generic IdAnnotation that will be filled by annotation_iterator() - xtypes::IdAnnotation ida(0); - if (not annotation_iterator(a, ida)) - { - throw IllegalOperationError("No Id Annotation found"); - } - return ida->id(); - } - -private: - - std::string name_; - xtypes::DynamicType dt_; - std::vector ann_; -}; - -} //namespace detail -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_XTYPES_DETAIL_MEMBER_TYPE_HPP_ diff --git a/include/dds/core/xtypes/detail/PrimitiveTypes.hpp b/include/dds/core/xtypes/detail/PrimitiveTypes.hpp deleted file mode 100644 index 6c2e225dd19..00000000000 --- a/include/dds/core/xtypes/detail/PrimitiveTypes.hpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_XTYPES_DETAIL_PRIMITIVE_TYPES_HPP_ -#define EPROSIMA_DDS_CORE_XTYPES_DETAIL_PRIMITIVE_TYPES_HPP_ - -#include - -// This template specialization have the intent to provide guidelines -// implementors of this specification. Notice that this define only a subset -// of primitive types, thus more work for you to do... - -namespace dds { -namespace core { -namespace xtypes { - -// Notice that const char* const is used instead of std::string -// to limit initialization issues with ctors. - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::BOOLEAN_TYPE; - static constexpr const char* NAME = "bool"; -}; - - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::UINT_8_TYPE; - static constexpr const char* NAME = "uint8_t"; -}; - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::INT_16_TYPE; - static constexpr const char* NAME = "int16_t"; -}; - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::UINT_16_TYPE; - static constexpr const char* NAME = "uint16_t"; -}; - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::INT_32_TYPE; - static constexpr const char* NAME = "int32_t"; -}; - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::UINT_32_TYPE; - static constexpr const char* NAME = "uint32_t"; -}; - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::INT_64_TYPE; - static constexpr const char* NAME = "int64_t"; -}; - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::UINT_64_TYPE; - static constexpr const char* NAME = "uint64_t"; -}; - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::FLOAT_32_TYPE; - static constexpr const char* NAME = "float"; -}; - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::FLOAT_64_TYPE; - static constexpr const char* NAME = "double"; -}; - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::FLOAT_128_TYPE; - static constexpr const char* NAME = "longdouble"; -}; - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::CHAR_8_TYPE; - static constexpr const char* NAME = "char"; -}; - -template<> -struct dynamic_type_traits -{ - static constexpr TypeKind TYPE_ID = TypeKind::CHAR_32_TYPE; - static constexpr const char* NAME = "char32_t"; -}; - - -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_XTYPES_DETAIL_PRIMITIVE_TYPES_HPP_ diff --git a/include/dds/core/xtypes/detail/StructType.hpp b/include/dds/core/xtypes/detail/StructType.hpp deleted file mode 100644 index a8682b1a526..00000000000 --- a/include/dds/core/xtypes/detail/StructType.hpp +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_XTYPES_DETAIL_STRUCT_TYPE_HPP_ -#define EPROSIMA_DDS_CORE_XTYPES_DETAIL_STRUCT_TYPE_HPP_ - -#include -#include - -#define COND_EXCEP_THROW(EXPR, CONT) if (EXPR){ \ - throw IllegalOperationError(CONT); \ -} - - -namespace dds { -namespace core { -namespace xtypes { -namespace detail { - - -class StructType -{ -public: - - StructType() - { - } - - void name( - const std::string& s) - { - name_ = s; - } - - void member( - const xtypes::MemberType& m) - { - members_.push_back(m); - } - - void members( - std::vector& v) - { - members_.reserve( v.size() + members_.size() ); - - for (auto it = v.begin(); v.end() != it; ++it) - { - members_.emplace_back(*it); - } - } - - template - void members( - MemberIter& begin, - MemberIter& end) - { - members_.reserve( (end - begin) + members_.size() ); - - for (auto it = begin; end != it; ++it) - { - members_.emplace_back(*it); - } - } - - void annotation( - xtypes::Annotation& a ) - { - annotations_.emplace_back(a); - } - - void annotations( - std::vector& v) - { - annotations_.reserve( v.size() + annotations_.size() ); - - for (auto it = v.begin(); v.end() != it; ++it) - { - annotations_.emplace_back(*it); - } - } - - template - void annotations( - AnnotationIter& begin, - AnnotationIter& end) - { - annotations_.reserve( (end - begin) + annotations_.size() ); - - for (auto it = begin; end != it; ++it) - { - annotations_.emplace_back(*it); - } - } - - const std::vector& members() const noexcept - { - return members_; - } - - const xtypes::MemberType& member( - uint32_t id) const - { - COND_EXCEP_THROW(id >= members_.size(), "no such member_id could be found"); - - return members_[id]; - } - - const xtypes::MemberType& member( - const std::string& s) const - { - auto retval = find_if( - members_.begin(), - members_.end(), - [&](const xtypes::MemberType& m) - { - return m.name() == s; - } - ); - - COND_EXCEP_THROW(retval == members_.end(), "member" + s + "not found"); - return *retval; - } - - const std::vector& annotations() - { - return annotations_; - } - - void remove_member( - const xtypes::MemberType& m) - { - auto rv = find_if( - members_.begin(), - members_.end(), - [&](xtypes::MemberType& t) - { - return t.name() == m.name(); - } - ); - - COND_EXCEP_THROW(rv == members_.end(), "could not find " + m.name() + " member"); - members_.erase(rv); - } - - void remove_annotation( - const xtypes::Annotation& a) - { - auto rv = find_if( - annotations_.begin(), - annotations_.end(), - [&]( xtypes::Annotation& aa) - { - return aa.akind() == a.akind(); - } - ); - - COND_EXCEP_THROW(rv == annotations_.end(), "could not find such annotation"); - annotations_.erase(rv); - } - -private: - - std::string name_; - std::vector members_; - std::vector annotations_; -}; - -} //namespace detail -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_XTYPES_DETAIL_STRUCT_TYPE_HPP_ diff --git a/include/dds/core/xtypes/detail/TypeProvider.hpp b/include/dds/core/xtypes/detail/TypeProvider.hpp deleted file mode 100644 index e818fde4c77..00000000000 --- a/include/dds/core/xtypes/detail/TypeProvider.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_XTYPES_DETAIL_TYPE_PROVIDER_HPP_ -#define EPROSIMA_DDS_CORE_XTYPES_DETAIL_TYPE_PROVIDER_HPP_ - -namespace dds { -namespace core { -namespace xtypes { -namespace detail { - -class TypeProvider -{ -}; - -} //namespace detail -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_XTYPES_DETAIL_TYPE_PROVIDER_HPP_ diff --git a/include/dds/core/xtypes/detail/UnionCase.hpp b/include/dds/core/xtypes/detail/UnionCase.hpp deleted file mode 100644 index 3eb31999aff..00000000000 --- a/include/dds/core/xtypes/detail/UnionCase.hpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_XTYPES_DETAIL_UNION_CASE_HPP_ -#define EPROSIMA_DDS_CORE_XTYPES_DETAIL_UNION_CASE_HPP_ - -namespace dds { -namespace core { -namespace xtypes { -namespace detail { - -template -class UnionCase -{ -}; - -} //namespace detail -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_XTYPES_DELEGATE_UNION_CASE_HPP_ diff --git a/include/dds/core/xtypes/detail/UnionType.hpp b/include/dds/core/xtypes/detail/UnionType.hpp deleted file mode 100644 index cbf9400e0e2..00000000000 --- a/include/dds/core/xtypes/detail/UnionType.hpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_CORE_XTYPES_DETAIL_UNION_TYPE_HPP_ -#define EPROSIMA_DDS_CORE_XTYPES_DETAIL_UNION_TYPE_HPP_ - -namespace dds { -namespace core { -namespace xtypes { -namespace detail { - -template -class UnionType -{ -}; - -} //namespace detail -} //namespace xtypes -} //namespace core -} //namespace dds - -#endif //EPROSIMA_DDS_CORE_XTYPES_DETAIL_UNION_TYPE_HPP_ diff --git a/include/dds/domain/DomainParticipant.hpp b/include/dds/domain/DomainParticipant.hpp deleted file mode 100644 index 4bcbe58b218..00000000000 --- a/include/dds/domain/DomainParticipant.hpp +++ /dev/null @@ -1,505 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_DOMAIN_DOMAINPARTICIPANT_HPP_ -#define OMG_DDS_DOMAIN_DOMAINPARTICIPANT_HPP_ - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -namespace dds { -namespace domain { - -class DomainParticipantListener; - -/** - * @brief - * A DomainParticipant represents the local membership of the application in a - * Domain. - * - * The DomainParticipant represents the participation of the application on - * a communication plane that isolates applications running on the same - * set of physical computers from each other. A domain establishes a virtual - * network linking all applications that share the same domainId and isolating - * them from applications running on different domains. In this way, several - * independent distributed applications can coexist in the same physical - * network without interfering, or even being aware of each other. - * - * @see @ref DCPS_Modules_DomainParticipant "Domain Participant" - */ -class DomainParticipant : public ::dds::core::TEntity -{ -public: - - /** - * Local representation of the dds::domain::DomainParticipantListener - */ - using Listener = DomainParticipantListener; - -public: - - OMG_DDS_REF_TYPE_PROTECTED_DC( - DomainParticipant, - dds::core::TEntity, - detail::DomainParticipant) - OMG_DDS_EXPLICIT_REF_BASE_DECL( - DomainParticipant, - dds::core::Entity) - - /** - * Creates a new DomainParticipant object. The DomainParticipant signifies - * that the calling application intends to join the Domain identified by - * the domain_id argument. - * - * The DomainParticipant will be created with the QoS values specified on the last - * successful call to - * @link dds::domain::DomainParticipant::default_participant_qos(const ::dds::domain::qos::DomainParticipantQos& qos) - * DomainParticipant::default_publisher_qos(qos) @endlink or, if the call was never - * made, the @ref anchor_dds_domain_domainparticipant_qos_defaults "default" values. - * - * @param id the id of the domain joined by the new DomainParticipant - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API DomainParticipant( - uint32_t id); - - /** - * Creates a new DomainParticipant object. The DomainParticipant signifies - * that the calling application intends to join the Domain identified by - * the domain_id argument. - * - * The DomainParticipant will be created with the DomainParticipantQos - * passed as an argument. - * - * @param id the id of the domain joined by the new DomainParticipant - * @param qos the QoS settings for the new DomainParticipant - * @param listener the listener - * @param event_mask the mask defining the events for which the listener - * will be notified. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API DomainParticipant( - uint32_t id, - const dds::domain::qos::DomainParticipantQos& qos, - dds::domain::DomainParticipantListener* listener = NULL, - const dds::core::status::StatusMask& event_mask = dds::core::status::StatusMask::all()); - - /** @cond */ - virtual OMG_DDS_API ~DomainParticipant(); - /** @endcond */ - - /** - * Register a listener with the DomainParticipant. - * - * The notifications received by the listener depend on the - * status mask with which it was registered. - * - * Listener un-registration is performed by setting the listener to NULL. - * - * See also @ref DCPS_Modules_Infrastructure_Listener "listener information". - * - * @param listener the listener - * @param event_mask the mask defining the events for which the listener - * will be notified. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::UnsupportedError - * A status was selected that cannot be supported because - * the infrastructure does not maintain the required connectivity information. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API void listener( - Listener* listener, - const ::dds::core::status::StatusMask& event_mask); - - /** - * Get the listener of this DomainParticipant. - * - * See also @ref DCPS_Modules_Infrastructure_Listener "listener information". - * - * @return the listener - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - */ - OMG_DDS_API Listener* listener() const; - - /** - * Gets the DomainParticipantQos setting for this instance. - * - * @return the qos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API const qos::DomainParticipantQos& qos() const; - - /** - * Sets the DomainParticipantQos setting for this instance. - * - * @param qos the qos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API void qos( - const qos::DomainParticipantQos& qos); - - /** - * This operation retrieves the domain_id used to create the - * DomainParticipant. The domain_id identifies the DDS domain - * to which the DomainParticipant belongs. - * - * Each DDS domain represents a separate data communication - * plane isolated from other domains. - * - * @return the domain id - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - */ - OMG_DDS_API uint32_t domain_id() const; - - - /** - * This operation will manually assert the liveliness for the DomainParticipant. - * - * This way, the Data Distribution Service is informed that the DomainParticipant - * is still alive. This operation only needs to be used when the DomainParticipant - * contains DataWriters with the dds:core::policy::LivelinessQosPolicy::ManualByParticipant(), - * and it will only affect the liveliness of those DataWriters. - * - * Writing data via the write operation of a DataWriter will assert the liveliness on - * the DataWriter itself and its DomainParticipant. Therefore, - * assert_liveliness is only needed when not writing regularly. - * The liveliness should be asserted by the application, depending on the - * LivelinessQosPolicy. - * - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - */ - OMG_DDS_API void assert_liveliness(); - - - /** - * This operation checks whether or not the given handle represents - * an Entity that was created by using this DomainParticipant. - * - * The containment applies recursively. That is, it applies both to - * entities (TopicDescription, Publisher, or Subscriber) created directly - * using the DomainParticipant as well as entities created using a - * contained Publisher, or Subscriber as the factory, and so forth. - * - * @param handle the instance handle for which the containement - * relationship has to be checked - * @return true if the handle belongs to an Entity belonging - * to this DomainParticipant - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - */ - OMG_DDS_API bool contains_entity( - const ::dds::core::InstanceHandle& handle); - - /** - * This operation returns the current value of the time that the service - * uses to time-stamp data writes and to set the reception timestamp - * for the data updates it receives. - * - * @return the current time - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - */ - OMG_DDS_API dds::core::Time current_time() const; - - /** @copydoc dds::domain::DomainParticipant::qos(const dds::domain::qos::DomainParticipantQos& qos) */ - OMG_DDS_API DomainParticipant& operator <<( - const qos::DomainParticipantQos& qos); - - /** @copydoc dds::domain::DomainParticipant::qos() */ - OMG_DDS_API const DomainParticipant& operator >>( - qos::DomainParticipantQos& qos) const; - - /** - * Gets the default DomainParticipantQos. - * - * This operation gets an object with the default global DomainParticipant - * QosPolicy settings which is used for newly - * created DomainParticipant objects, in case no QoS was provided during the creation. - * - * The values retrieved by this operation match the set of values specified on the last - * successful call to - * dds::domain::DomainParticipant::default_participant_qos(const ::dds::domain::qos::DomainParticipantQos& qos), - * or, if the call was never made, the @ref anchor_dds_domain_domainparticipant_qos_defaults "default" values. - * - * @return the default DomainParticipantQos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API static qos::DomainParticipantQos default_participant_qos(); - - /** - * Sets the default DomainParticipantQos. - * - * This QoS will be used by all following DomainParticipant creations when no - * QoS was given during those creations or the QoS is given that was returned - * by dds::domain::DomainParticipant::default_participant_qos(). - * - * @param qos the default DomainParticipantQos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API static void default_participant_qos( - const ::dds::domain::qos::DomainParticipantQos& qos); - - /** - * Gets the default PublisherQos of the DomainParticipant. - * - * This operation gets an object with the default Publisher QosPolicy settings of - * the DomainParticipant (that is the PublisherQos) which is used for newly - * created Publisher objects, in case no QoS was provided during the creation. - * - * The values retrieved by this operation match the set of values specified on the last - * successful call to - * dds::domain::DomainParticipant::default_publisher_qos(const ::dds::pub::qos::PublisherQos& qos), - * or, if the call was never made, the @ref anchor_dds_pub_publisher_qos_defaults "default" values. - * - * @return the default PublisherQos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API dds::pub::qos::PublisherQos default_publisher_qos() const; - - /** - * Sets the default PublisherQos of the DomainParticipant. - * - * This operation sets the default PublisherQos of the DomainParticipant which - * is used for newly created Publisher objects, when no QoS is provided. - * - * The PublisherQos is always self consistent, because its policies do not depend on each - * other. This means that this operation never throws dds::core::InconsistentPolicyError. - * - * The values set by this operation are returned by dds::domain::DomainParticipant::default_publisher_qos(). - * - * @param qos the default PublisherQos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::UnsupportedError - * One or more of the selected QosPolicy values are - * currently not supported by OpenSplice. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API DomainParticipant& default_publisher_qos( - const ::dds::pub::qos::PublisherQos& qos); - - /** - * Gets the default SubscriberQos of the DomainParticipant. - * - * This operation gets an object with the default Subscriber QosPolicy settings of - * the DomainParticipant (that is the SubscriberQos) which is used for newly - * created Subscriber objects, in case no QoS was provided during the creation. - * - * The values retrieved by this operation match the set of values specified on the last - * successful call to - * dds::domain::DomainParticipant::default_subscriber_qos(const :dds::sub::qos::SubscriberQos& qos), - * or, if the call was never made, the @ref anchor_dds_sub_subscriber_qos_defaults "default" values. - * - * @return the default SubscriberQos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API dds::sub::qos::SubscriberQos default_subscriber_qos() const; - - /** - * Sets the default SubscriberQos of the DomainParticipant. - * - * This operation sets the default SubscriberQos of the DomainParticipant which - * is used for newly created Subscriber objects, when no QoS is provided. - * - * The SubscriberQos is always self consistent, because its policies do not depend on each - * other. This means that this operation never throws dds::core::InconsistentPolicyError. - * - * The values set by this operation are returned by dds::domain::DomainParticipant::default_subscriber_qos(). - * - * @param qos the default SubscriberQos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::UnsupportedError - * One or more of the selected QosPolicy values are - * currently not supported by OpenSplice. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API DomainParticipant& default_subscriber_qos( - const ::dds::sub::qos::SubscriberQos& qos); - - /** - * Gets the default TopicQos of the DomainParticipant. - * - * This operation gets an object with the default Topic QosPolicy settings of - * the DomainParticipant (that is the TopicQos) which is used for newly - * created Topic objects, in case no QoS was provided during the creation. - * - * The values retrieved by this operation match the set of values specified on the last - * successful call to - * dds::domain::DomainParticipant::default_topic_qos(const dds::topic::qos::TopicQos& qos), - * or, if the call was never made, the @ref anchor_dds_topic_qos_defaults "default" values. - * - * @return the default TopicQos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API dds::topic::qos::TopicQos default_topic_qos() const; - - /** - * Sets the default TopicQos of the DomainParticipant. - * - * This operation sets the default SubscriberQos of the DomainParticipant which - * is used for newly created Subscriber objects, when no QoS is provided. - * - * This operation checks if the TopicQos is self consistent. If it is not, the - * operation has no effect and throws dds::core::InconsistentPolicyError. - * - * The values set by this operation are returned by dds::domain::DomainParticipant::default_topic_qos(). - * - * @param qos the default TopicQos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::UnsupportedError - * One or more of the selected QosPolicy values are - * currently not supported by OpenSplice. - * @throws dds::core::InconsistentPolicyError - * The parameter qos contains conflicting QosPolicy settings, - * e.g. a history depth that is higher than the specified resource limits. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API DomainParticipant& default_topic_qos( - const dds::topic::qos::TopicQos& qos); - - //============================================================================= -}; - -} //namespace domain -} //namespace dds - -#endif //OMG_DDS_DOMAIN_DOMAINPARTICIPANT_HPP_ diff --git a/include/dds/domain/DomainParticipantListener.hpp b/include/dds/domain/DomainParticipantListener.hpp deleted file mode 100644 index 2d3581082b0..00000000000 --- a/include/dds/domain/DomainParticipantListener.hpp +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_DOMAIN_DOMAINPARTICIPANT_LISTENER_HPP_ -#define OMG_DDS_DOMAIN_DOMAINPARTICIPANT_LISTENER_HPP_ - -// TODO Remove when PSM DDS Listeners are ready to be used. -#include - -// TODO uncomment when PSM DDS Listeners are ready to be used. -/* -#include -#include -#include -*/ - -namespace dds { -namespace domain { - -/** - * @brief - * DomainParticipant events Listener - * - * Since a DomainParticipant is an Entity, it has the ability to have a Listener - * associated with it. In this case, the associated Listener should be of type - * DomainParticipantListener. This interface must be implemented by the - * application. A user-defined class must be provided by the application which must - * extend from the DomainParticipantListener class. - * - * - * All operations for this interface must be implemented in the user-defined class, it is - * up to the application whether an operation is empty or contains some functionality. - * - * - * The DomainParticipantListener provides a generic mechanism (actually a - * callback function) for the Data Distribution Service to notify the application of - * relevant asynchronous status change events, such as a missed deadline, violation of - * a QosPolicy setting, etc. The DomainParticipantListener is related to - * changes in communication status StatusConditions. - * - * @code{.cpp} - * // Application example listener - * class ExampleListener : - * public virtual dds::domain::DomainParticipantListener - * { - * public: - * virtual void on_inconsistent_topic ( - * dds::topic::AnyTopic& topic, - * const dds::core::status::InconsistentTopicStatus& status) - * { - * std::cout << "on_inconsistent_topic" << std::endl; - * } - * - * virtual void on_offered_deadline_missed ( - * dds::pub::AnyDataWriter& writer, - * const dds::core::status::OfferedDeadlineMissedStatus& status) - * { - * std::cout << "on_offered_deadline_missed" << std::endl; - * } - * - * virtual void on_offered_incompatible_qos ( - * dds::pub::AnyDataWriter& writer, - * const dds::core::status::OfferedIncompatibleQosStatus& status) - * { - * std::cout << "on_offered_incompatible_qos" << std::endl; - * } - * - * virtual void on_liveliness_lost ( - * dds::pub::AnyDataWriter& writer, - * const dds::core::status::LivelinessLostStatus& status) - * { - * std::cout << "on_liveliness_lost" << std::endl; - * } - * - * virtual void on_publication_matched ( - * dds::pub::AnyDataWriter& writer, - * const dds::core::status::PublicationMatchedStatus& status) - * { - * std::cout << "on_publication_matched" << std::endl; - * } - * - * virtual void on_requested_deadline_missed ( - * dds::sub::AnyDataReader& reader, - * const dds::core::status::RequestedDeadlineMissedStatus & status) - * { - * std::cout << "on_requested_deadline_missed" << std::endl; - * } - * - * virtual void on_requested_incompatible_qos ( - * dds::sub::AnyDataReader& reader, - * const dds::core::status::RequestedIncompatibleQosStatus & status) - * { - * std::cout << "on_requested_incompatible_qos" << std::endl; - * } - * - * virtual void on_sample_rejected ( - * dds::sub::AnyDataReader& reader, - * const dds::core::status::SampleRejectedStatus & status) - * { - * std::cout << "on_sample_rejected" << std::endl; - * } - * - * virtual void on_liveliness_changed ( - * dds::sub::AnyDataReader& reader, - * const dds::core::status::LivelinessChangedStatus & status) - * { - * std::cout << "on_liveliness_changed" << std::endl; - * } - * - * virtual void on_data_available ( - * dds::sub::AnyDataReader& reader) - * { - * std::cout << "on_data_available" << std::endl; - * } - * - * virtual void on_subscription_matched ( - * dds::sub::AnyDataReader& reader, - * const dds::core::status::SubscriptionMatchedStatus & status) - * { - * std::cout << "on_subscription_matched" << std::endl; - * } - * - * virtual void on_sample_lost ( - * dds::sub::AnyDataReader& reader, - * const dds::core::status::SampleLostStatus & status) - * { - * std::cout << "on_sample_lost" << std::endl; - * } - * - * virtual void on_data_on_readers ( - * dds::sub::Subscriber& subs) - * { - * std::cout << "on_data_on_readers" << std::endl; - * } - * }; - * - * // Create DomainParticipant with the listener - * dds::domain::DomainParticipant participant(org::opensplice::domain::default_id(), - * dds::domain::DomainParticipant::default_participant_qos(), - * new ExampleListener(), - * dds::core::status::StatusMask::all()); - * - * @endcode - * - * @see @ref DCPS_Modules_DomainParticipant "Domain Participant" - * @see @ref DCPS_Modules_Infrastructure_Listener "Listener information" - */ - -// TODO Uncomment when PSM DDS listeners are ready to be used -/* -class OMG_DDS_API DomainParticipantListener : - public virtual dds::pub::PublisherListener, - public virtual dds::sub::SubscriberListener, - public virtual dds::topic::AnyTopicListener -{ -public: - - virtual ~DomainParticipantListener() - { - } - -}; -*/ -class DomainParticipantListener : public eprosima::fastdds::dds::DomainParticipantListener -{ -public: - - virtual ~DomainParticipantListener() - { - } - -}; - - -/** - * @brief - * DomainParticipant events Listener - * - * This listener is just like DomainParticipantListener, except - * that the application doesn't have to implement all operations. - * - * @code{.cpp} - * class ExampleListener : - * public virtual dds::domain::NoOpDomainParticipantListener - * { - * // Not necessary to implement any Listener operations. - * }; - * @endcode - * - * @see dds::domain::DomainParticipantListener - */ -// TODO Uncomment when PSM DDS listeners are ready to be used -/* -class OMG_DDS_API NoOpDomainParticipantListener : - public virtual DomainParticipantListener, - public virtual dds::pub::NoOpPublisherListener, - public virtual dds::sub::NoOpSubscriberListener, - public virtual dds::topic::NoOpAnyTopicListener -{ -public: - - virtual ~NoOpDomainParticipantListener() - { - } - -}; -*/ -class NoOpDomainParticipantListener : public eprosima::fastdds::dds::DomainParticipantListener -{ -public: - ~NoOpDomainParticipantListener() - { - } -}; - -} //namespace domain -} //namespace dds - -#endif //OMG_DDS_DOMAIN_DOMAINPARTICIPANT_LISTENER_HPP_ diff --git a/include/dds/domain/detail/DomainParticipant.hpp b/include/dds/domain/detail/DomainParticipant.hpp deleted file mode 100644 index 97f857f4be9..00000000000 --- a/include/dds/domain/detail/DomainParticipant.hpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_DOMAIN_DETAIL_DOMAINPARTICIPANT_HPP_ -#define EPROSIMA_DDS_DOMAIN_DETAIL_DOMAINPARTICIPANT_HPP_ - -#include - -namespace dds { -namespace domain { -namespace detail { - -using DomainParticipant = eprosima::fastdds::dds::DomainParticipant; - -} //namespace detail -} //namespace domain -} //namespace dds - - -#endif //EPROSIMA_DDS_DOMAIN_DETAIL_DOMAINPARTICIPANT_HPP_ diff --git a/include/dds/domain/qos/DomainParticipantQos.hpp b/include/dds/domain/qos/DomainParticipantQos.hpp deleted file mode 100644 index 6f7b111e2ee..00000000000 --- a/include/dds/domain/qos/DomainParticipantQos.hpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_DOMAIN_QOS_DOMAINPARTICIPANTQOS_HPP_ -#define OMG_DDS_DOMAIN_QOS_DOMAINPARTICIPANTQOS_HPP_ - -#include - -namespace dds { -namespace domain { -namespace qos { - -using DomainParticipantQos = dds::domain::qos::detail::DomainParticipantQos; - -} //namespace qos -} //namespace domain -} //namespace dds - -#endif //OMG_DDS_DOMAIN_QOS_DOMAINPARTICIPANTQOS_HPP_ diff --git a/include/dds/domain/qos/detail/DomainParticipantQos.hpp b/include/dds/domain/qos/detail/DomainParticipantQos.hpp deleted file mode 100644 index e3c5de2d0a2..00000000000 --- a/include/dds/domain/qos/detail/DomainParticipantQos.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_DOMAIN_QOS_DETAIL_DOMAINPARTICIPANTQOS_HPP_ -#define EPROSIMA_DDS_DOMAIN_QOS_DETAIL_DOMAINPARTICIPANTQOS_HPP_ - -#include - -namespace dds { -namespace domain { -namespace qos { -namespace detail { - -using DomainParticipantQos = eprosima::fastdds::dds::DomainParticipantQos; - -} //namespace detail -} //namespace qos -} //namespace domain -} //namespace dds - -#endif //EPROSIMA_DDS_DOMAIN_QOS_DETAIL_DOMAINPARTICIPANTQOS_HPP_ diff --git a/include/dds/pub/AnyDataWriter.hpp b/include/dds/pub/AnyDataWriter.hpp deleted file mode 100644 index 126c52ed5aa..00000000000 --- a/include/dds/pub/AnyDataWriter.hpp +++ /dev/null @@ -1,373 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_PUB_ANY_DATA_WRITER_HPP_ -#define OMG_DDS_PUB_ANY_DATA_WRITER_HPP_ - -#include - -#include -#include - -#include -//#include - -namespace dds { -namespace pub { - -/** - * @brief - * Typeless base class for the typed DataWriter. - * - * DataWriters are created type specific (fi DataWriter writer). However, there - * are many places in the API (and possibly application) where the type can not be known - * while still some DataWriter has to be passed around, stored or even typeless functionality - * called.
    - * Main examples in the API that need typeless DataWriter are: Publisher, PublisherListener - * and DomainParticipantListener. - * - */ -template -class TAnyDataWriter : public dds::core::TEntity -{ -public: - - OMG_DDS_REF_TYPE_PROTECTED_DC( - TAnyDataWriter, - dds::core::TEntity, - DELEGATE) - - OMG_DDS_IMPLICIT_REF_BASE( - TAnyDataWriter) - - /** @cond */ - virtual ~TAnyDataWriter(); - /** @endcond */ - - //========================================================================== - //== Entity Navigation - - /** - * Get the Publisher that owns this DataWriter. - * - * @return the Publisher - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - */ - OMG_DDS_API const Publisher& publisher() const; - - /** - * Get the TopicDescription associated with this DataWriter. - * - * @return the TopicDescription - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - */ - // const dds::topic::TopicDescription& topic_description() const; - - - - //========================================================================== - //== QoS Management - - /** - * Gets the DataWriterQos setting for this instance. - * - * @return the qos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API qos::DataWriterQos qos() const; - - /** - * This operation replaces the existing set of QosPolicy settings for a DataWriter. - * - * The parameter qos contains the object with the QosPolicy settings which is - * checked for self-consistency and mutability. - * - * When the application tries to change a - * QosPolicy setting for an enabled DataWriter, which can only be set before the - * DataWriter is enabled, the operation will fail and a - * ImmutablePolicyError is thrown. In other words, the application must - * provide the presently set QosPolicy settings in case of the immutable QosPolicy - * settings. Only the mutable QosPolicy settings can be changed. - * - * When the qos contains conflicting QosPolicy settings (not self-consistent), - * the operation will fail and an InconsistentPolicyError is thrown. - * - * @param qos the qos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::ImmutablePolicyError - * The parameter qos contains an immutable QosPolicy setting with a - * different value than set during enabling of the DataWriter. - * @throws dds::core::InconsistentPolicyError - * The parameter qos contains conflicting QosPolicy settings, - */ - OMG_DDS_API void qos( - const qos::DataWriterQos& qos); - - /** @copydoc dds::pub::TAnyDataWriter::qos(const dds::pub::qos::DataWriterQos& qos) */ - OMG_DDS_API TAnyDataWriter& operator <<( - const qos::DataWriterQos& qos); - - /** @copydoc dds::pub::TAnyDataWriter::qos() */ - OMG_DDS_API const TAnyDataWriter& operator >>( - qos::DataWriterQos& qos) const; - - - //========================================================================== - //== ACKs - - /** - * This operation blocks the calling thread until either all data written - * by the DataWriter is acknowledged by the local infrastructure, or until - * the duration specified by the timeout parameter elapses, - * whichever happens first. - * - * Data is acknowledged by the local infrastructure when it does not need to be stored - * in its DataWriter’s local history. When a locally-connected subscription (including - * the networking service) has no more resources to store incoming samples it will start - * to reject these samples, resulting in their source DataWriters to store them - * temporarily in their own local history to be retransmitted at a later moment in time.
    - * In such scenarios, the wait_for_acknowledgments operation will block until the - * DataWriter has retransmitted its entire history, which is therefore effectively - * empty, or until the timeout expires, whichever happens first. In the latter - * case, this operation will throw a TimeoutError. - * - * - * Be aware that in case the operation returns normally, the data has only been - * acknowledged by the local infrastructure: it does not mean all remote subscriptions - * have already received the data. However, delivering the data to remote nodes is then - * the sole responsibility of the networking service: even when the publishing - * application would terminate, all data that has not yet been received may be - * considered ‘on-route’ and will therefore eventually arrive (unless the networking - * service itself will crash). In contrast, if a DataWriter would still have data in it’s - * local history buffer when it terminates, this data is considered ‘lost’. - * - * - * This operation is intended to be used only if one or more of the contained - * DataWriters has its ReliabilityQosPolicyKind set to RELIABLE. - * Otherwise the operation will return immediately, since best-effort DataWriters will - * never store rejected samples in their local history: - * they will just drop them and continue business as usual. - * - * @param timeout the time out duration - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::TimeoutError - * Not all data is acknowledged before timeout elapsed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API void wait_for_acknowledgments( - const dds::core::Duration& timeout); - - //========================================================================== - //== Status Management - - /** - * This operation obtains the LivelinessLostStatus object of the DataWriter. - * - * The LivelinessLostStatus contains the information whether the liveliness (that the - * DataWriter has committed through its Liveliness QosPolicy) was respected. - * This means that the status represents whether the DataWriter failed to actively - * signal its liveliness within the offered liveliness period. If the liveliness is lost, the - * DataReader objects will consider the DataWriter as no longer “alive”. - * - * The LivelinessLostStatus can also be monitored using a - * DataWriterListener or by using the associated StatusCondition. - * - * @return the LivelinessLostStatus - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API const dds::core::status::LivelinessLostStatus liveliness_lost_status(); - - /** - * This operation obtains the OfferedDeadlineMissedStatus object of the DataWriter. - * - * The OfferedDeadlineMissedStatus contains the information whether the deadline (that the - * DataWriter has committed through its Deadline QosPolicy) was respected for - * each instance. - * - * The OfferedDeadlineMissedStatus can also be monitored using a - * DataWriterListener or by using the associated StatusCondition. - * - * @return the OfferedDeadlineMissedStatus - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API const dds::core::status::OfferedDeadlineMissedStatus offered_deadline_missed_status(); - - /** - * This operation obtains the OfferedIncompatibleQosStatus object of the DataWriter. - * - * The OfferedIncompatibleQosStatus contains the information whether a QosPolicy setting - * was incompatible with the requested QosPolicy setting. - * - * This means that the status represents whether a DataReader object has been - * discovered by the DataWriter with the same Topic and a requested - * DataReaderQos that was incompatible with the one offered by the DataWriter. - * - * The OfferedIncompatibleQosStatus can also be monitored using a - * DataWriterListener or by using the associated StatusCondition. - * - * @return the OfferedIncompatibleQosStatus - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API const dds::core::status::OfferedIncompatibleQosStatus offered_incompatible_qos_status(); - - /** - * This operation obtains the PublicationMatchedStatus object of the DataWriter. - * - * The PublicationMatchedStatus contains the information whether a new match has been - * discovered for the current publication, or whether an existing match has ceased to - * exist. - * - * This means that the status represents that either a DataReader object has been - * discovered by the DataWriter with the same Topic and a compatible Qos, or that a - * previously discovered DataReader has ceased to be matched to the current - * DataWriter. A DataReader may cease to match when it gets deleted, when it - * changes its Qos to a value that is incompatible with the current DataWriter or - * when either the DataWriter or the DataReader has chosen to put its matching - * counterpart on its ignore-list using the dds::sub::ignore or - * dds::pub::ignore operations. - * - * The operation may fail if the infrastructure does not hold the information necessary - * to fill in the PublicationMatchedStatus. This is the case when OpenSplice is - * configured not to maintain discovery information in the Networking Service. (See - * the description for the NetworkingService/Discovery/enabled property in - * the Deployment Manual for more information about this subject.) In this case the - * operation will throw UnsupportedError. - * - * The PublicationMatchedStatus can also be monitored using a - * DataWriterListener or by using the associated StatusCondition. - * - * @return the PublicationMatchedStatus - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::UnsupportedError - * OpenSplice is configured not to maintain the information - * about “associated” subscriptions. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API const dds::core::status::PublicationMatchedStatus publication_matched_status(); - - - //========================================================================== - //== Liveliness Management - - /** - * This operation asserts the liveliness for the DataWriter. - * - * This operation will manually assert the liveliness for the DataWriter. This way, - * the Data Distribution Service is informed that the corresponding DataWriter is - * still alive. This operation is used in combination with the Liveliness QosPolicy - * set to Liveliness::ManualByParticipant or Liveliness::ManualByTopic. - * - * Writing data via the write operation of a DataWriter will assert the liveliness on - * the DataWriter itself and its containing DomainParticipant. Therefore, - * assert_liveliness is only needed when not writing regularly. - * - * The liveliness should be asserted by the application, depending on the - * LivelinessQosPolicy. Asserting the liveliness for this DataWriter can also - * be achieved by asserting the liveliness to the DomainParticipant. - * - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The entity has not yet been enabled. - */ - OMG_DDS_API void assert_liveliness(); - -protected: - - const Publisher* publisher_; - -}; - -typedef ::dds::pub::detail::AnyDataWriter AnyDataWriter; - -} //namespace pub -} //namespace dds - -#endif //OMG_DDS_PUB_ANY_DATA_WRITER_HPP_ diff --git a/include/dds/pub/DataWriter.hpp b/include/dds/pub/DataWriter.hpp deleted file mode 100644 index a28d6b2c2b2..00000000000 --- a/include/dds/pub/DataWriter.hpp +++ /dev/null @@ -1,1611 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_PUB_DATA_WRITER_HPP_ -#define OMG_DDS_PUB_DATA_WRITER_HPP_ - -#include -//#include -//#include -#include -#include - -#include - -/** @cond */ -namespace dds { -namespace pub { - -template -class DataWriter; - -template -class DataWriterListener; - -/** @endcond */ - -/** - * @brief - * DataWriter allows the application to set the value of the sample to be published - * under a given Topic. - * - * A DataWriter is attached to exactly one Publisher. - * - * A DataWriter is bound to exactly one Topic and therefore to exactly one data - * type. The Topic must exist prior to the DataWriter's creation. - * DataWriter is an abstract class. It must be specialized for each particular - * application data type. For a fictional application data type Bar (defined in the - * module Foo) the specialized class would be dds::pub::DataWriter. - * - * The pre-processor generates from IDL type descriptions the application - * DataWriter classes. For each application data type that is used as Topic - * data type, a typed class DataWriter is derived from the AnyDataWriter - * class. - * - * For instance, for an application, the definitions are located in the Foo.idl file. - * The pre-processor will generate a ccpp_Foo.h include file. - * - * General note: The name ccpp_Foo.h is derived from the IDL file Foo.idl, - * that defines Foo::Bar, for all relevant DataWriter operations. - * - * @note Apart from idl files, Google protocol buffers are also supported. For the - * API itself, it doesn't matter if the type header files were generated from - * idl or protocol buffers. The resulting API usage and includes remain the same. - * - * @code{.cpp} - * // Default creation of a DataWriter - * dds::domain::DomainParticipant participant(org::opensplice::domain::default_id()); - * dds::topic::Topic topic(participant, "TopicName"); - * dds::pub::Publisher publisher(participant); - * dds::pub::DataWriter writer(publisher, topic); - * - * // Default write of a sample on the DataWriter - * Foo::Bar sample; - * writer.write(sample); - * @endcode - * - * @see @ref DCPS_Modules_Publication "Publication concept" - * @see @ref DCPS_Modules_Publication_DataWriter "DataWriter concept" - */ -template -class DataWriter : public TAnyDataWriter -{ -public: - - /** - * Local convenience typedef for dds::pub::DataWriterListener. - */ - using Listener = DataWriterListener; - - OMG_DDS_REF_TYPE_PROTECTED_DC( - DataWriter, - dds::pub::TAnyDataWriter, - detail::DataWriter) - - OMG_DDS_IMPLICIT_REF_BASE( - DataWriter) - - /** - * Create a new DataWriter for the desired Topic, using the given Publisher. - * - * The DataWriter will be created with the QoS values specified on the last - * successful call to @link dds::pub::Publisher::default_datawriter_qos(const dds::pub::qos::DataWriterQos& qos) - * pub.default_datawriter_qos(qos) @endlink or, if the call was never made, the - * @ref anchor_dds_pub_datawriter_qos_defaults "default" values. - * - * Implicit Publisher
    - * It is expected to provide a Publisher when creating a DataWriter. However, it is - * allowed to provide dds::core::null. When dds::core::null is provided, then an implicit - * Publisher is created with a default QoS and the DomainParticipant from the provided - * Topic. - * - * @param pub the Publisher that will contain this DataWriter - * (or dds::core::null for an implicit publisher) - * @param topic the Topic associated with this DataWriter - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - // DataWriter( - // const Publisher& pub, - // const ::dds::topic::Topic& topic); - - /** - * Create a new DataWriter for the desired Topic, using the given Publisher and - * DataWriterQos and attaches the optionally specified DataWriterListener to it. - * - * QoS
    - * A possible application pattern to construct the DataWriterQos for the - * DataWriter is to: - * @code{.cpp} - * // 1) Retrieve the QosPolicy settings on the associated Topic - * dds::topic::qos::TopicQos topicQos = topic.qos(); - * // 2) Retrieve the default DataWriterQos from the related Publisher - * dds::pub::qos::DataWriterQos writerQos = publisher.default_datawriter_qos(); - * // 3) Combine those two lists of QosPolicy settings by overwriting DataWriterQos - * // policies that are also present TopicQos - * writerQos = topicQos; - * // 4) Selectively modify QosPolicy settings as desired. - * writerQos << dds::core::policy::WriterDataLifecycle::ManuallyDisposeUnregisteredInstances(); - * // 5) Use the resulting QoS to construct the DataWriter. - * dds::pub::DataWriter writer(publisher, topic, writerQos); - * @endcode - * - * Restictions on QoS policies - * For a coherent writer there exists a constraint on the setting of the History QoS policy. - * When a writer is created with publisher that has a presentation QosPolicy with - * coherent_access enabled and where the access_scope is either TOPIC or GROUP - * then the History QoS policy of the coherent writer should be set to KEEP_ALL. - * Applying this constraint is necessary because in case of a keep-last writer the - * samples in the writers history could be pushed out by a new sample which causes that - * the transaction would not become complete. - * - * Implicit Publisher
    - * It is expected to provide a Publisher when creating a DataWriter. However, it is - * allowed to provide dds::core::null. When dds::core::null is provided, then an implicit - * Publisher is created with a default QoS and the DomainParticipant from the provided - * Topic. - * - * Listener
    - * The following statuses are applicable to the DataWriterListener: - * - dds::core::status::StatusMask::offered_deadline_missed() - * - dds::core::status::StatusMask::offered_incompatible_qos() - * - dds::core::status::StatusMask::liveliness_lost() - * - dds::core::status::StatusMask::publication_matched() - * - * See @ref DCPS_Modules_Infrastructure_Listener "listener concept", - * @ref anchor_dds_pub_datawriter_commstatus "communication status" and - * @ref anchor_dds_pub_datawriter_commpropagation "communication propagation" - * for more information. - * - * @param pub the Publisher that will contain this DataWriter - * (or dds::core::null for an implicit publisher) - * @param topic the Topic associated with this DataWriter - * @param qos the DataWriter qos. - * @param listener the DataWriter listener. - * @param mask the listener event mask. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::InconsistentPolicyError - * The parameter qos contains conflicting QosPolicy settings. - * @throws dds::core::PreconditionNotMetError - * The History QosPolicy is not KEEP_ALL when applied to a coherent writer. - */ - // DataWriter( - // const Publisher& pub, - // const ::dds::topic::Topic& topic, - // const qos::DataWriterQos& qos, - // DataWriterListener* listener = nullptr, - // const dds::core::status::StatusMask& mask = ::dds::core::status::StatusMask::all()); - - /** @cond */ - virtual ~DataWriter(); - /** @endcond */ - - //========================================================================== - //== Write API - - /** - * This operation modifies the value of a data instance. - * - * Detailed Description
    - * This operation modifies the value of a data instance. When this operation is used, - * the Data Distribution Service will automatically supply the value of the - * source_timestamp that is made available to connected DataReader objects.
    - * This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * @anchor anchor_dds_pub_datawriter_write_blocking - * Blocking
    - * If the dds::core::policy::History QosPolicy is set to KEEP_ALL, the write - * operation on the DataWriter may block if the modification would cause data to be - * lost because one of the limits, specified in the dds::core::policy::ResourceLimits, is - * exceeded. In case the synchronous attribute value of the - * dds::core::policy::Reliability is set to TRUE for communicating DataWriters and - * DataReaders then the DataWriter will wait until all synchronous - * DataReaders have acknowledged the data. Under these circumstances, the - * max_blocking_time attribute of the dds::core::policy::Reliability configures the - * maximum time the write operation may block (either waiting for space to become - * available or data to be acknowledged). If max_blocking_time elapses before the - * DataWriter is able to store the modification without exceeding the limits and all - * expected acknowledgements are received, the write operation will fail and throw - * TimeoutError. - * - * @param sample the sample to be written - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - OMG_DDS_API void write( - const T& sample); - - /** - * This operation modifies the value of a data instance and provides a value for the - * source_timestamp explicitly. - * - * Detailed Description
    - * It modifies the values of the given data instances. When this operation is used, - * the application provides the value for the parameter source_timestamp that is made - * available to connected DataReader objects.
    - * This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_write_blocking "write blocking"). - * - * @param sample the sample to be written - * @param timestamp the timestamp used for this sample - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - OMG_DDS_API void write( - const T& sample, - const dds::core::Time& timestamp); - - /** - * This operation modifies the value of a data instance. - * - * Detailed Description
    - * This operation modifies the value of a data instance. When this operation is used, - * the Data Distribution Service will automatically supply the value of the - * source_timestamp that is made available to connected DataReader objects.
    - * This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * Before writing data to an instance, the instance may be registered with the - * @ref dds::pub::DataWriter::register_instance(const T& key) "\"register_instance\"" or - * @ref dds::pub::DataWriter::register_instance(const T& key, const dds::core::Time& timestamp) "\"register_instance_w_timestamp\"" - * The handle returned by one of the register_instance operations can be supplied to - * the parameter handle of the write operation. However, it is also possible to - * supply a default InstanceHandle (InstanceHandle.is_nil() == true), which means - * that the identity of the instance is automatically deduced from the instance_data - * (identified by the key). - * - * @anchor anchor_dds_pub_datawriter_write_instance_handle - * Instance Handle
    - * The default InstanceHandle (InstanceHandle.is_nil() == true) can be used for the - * parameter handle. This indicates the identity of the instance is automatically deduced - * from the instance_data (by means of the key). - * - * If handle is not nil, it must correspond to the value returned by - * @ref dds::pub::DataWriter::register_instance(const T& key) "\"register_instance\"" or - * @ref dds::pub::DataWriter::register_instance(const T& key, const dds::core::Time& timestamp) "\"register_instance_w_timestamp\"" - * when the instance (identified by its key) was registered. Passing such a registered - * handle helps the Data Distribution Service to process the sample more efficiently.
    - * If there is no correspondence between handle and sample, the result of the operation - * is unspecified. - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_write_blocking "write blocking"). - * - * @param sample the sample to be written - * @param instance the handle representing the instance written - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - OMG_DDS_API void write( - const T& sample, - const ::dds::core::InstanceHandle& instance); - - /** - * This operation modifies the value of a data instance and provides a value for the - * source_timestamp explicitly. - * - * Detailed Description
    - * It modifies the values of the given data instances. When this operation is used, - * the application provides the value for the parameter source_timestamp that is made - * available to connected DataReader objects.
    - * This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * Instance Handle
    - * See @ref anchor_dds_pub_datawriter_write_instance_handle "write instance handle". - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_write_blocking "write blocking"). - * - * @param sample the sample to be written - * @param instance the handle representing the instance written - * @param timestamp the timestamp to use for this sample - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - OMG_DDS_API void write( - const T& data, - const ::dds::core::InstanceHandle& instance, - const dds::core::Time& timestamp); - - - /** - * This operation modifies the value of a data instance. - * - * Detailed Description
    - * This operation modifies the value of a data instance. When this operation is used, - * the Data Distribution Service will automatically supply the value of the - * source_timestamp that is made available to connected DataReader objects.
    - * This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * Topic Instance
    - * A TopicInstance encapsulates a sample and its associated - * @ref anchor_dds_pub_datawriter_write_instance_handle "instance handle". - * - * - * @param i the instance to write - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - // void write( - // const dds::topic::TopicInstance& i); - - /** - * This operation modifies the value of a data instance and provides a value for the - * source_timestamp explicitly. - * - * Detailed Description
    - * It modifies the values of the given data instances. When this operation is used, - * the application provides the value for the parameter source_timestamp that is made - * available to connected DataReader objects.
    - * This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * Topic Instance
    - * A TopicInstance encapsulates a sample and its associated - * @ref anchor_dds_pub_datawriter_write_instance_handle "instance handle". - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_write_blocking "write blocking"). - * - * @param i the instance to write - * @param timestamp the timestamp for this sample - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - // void write( - // const dds::topic::TopicInstance& i, - // const dds::core::Time& timestamp); - - /** - * This operation writes a series of typed Samples or TopicInstances. - * - * Detailed Description
    - * This operation takes a sequence of typed Samples or TopicInstances, which - * is determined by the template specialization. - * - * It modifies the values of the given data instances. When this operation is used, - * the Data Distribution Service will automatically supply the value of the - * source_timestamp that is made available to connected DataReader objects.
    - * This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * Topic Instance
    - * A TopicInstance encapsulates a typed Sample and its associated - * @ref anchor_dds_pub_datawriter_write_instance_handle "instance handle". - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_write_blocking "write blocking"). - * - * @param begin An iterator pointing to the beginning of a sequence of - * Samples or a sequence of TopicInstances - * @param end An iterator pointing to the end of a sequence of - * Samples or a sequence of TopicInstances - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - template - OMG_DDS_API void write( - const FWIterator& begin, - const FWIterator& end); - - /** - * This operation writes a series of typed Samples or TopicInstances and provides - * a value for the source_timestamp for these samples explicitly. - * - * Detailed Description
    - * This operation takes a sequence of typed Samples or TopicInstances, which - * is determined by the template specialization. - * - * It modifies the values of the given data instances. When this operation is used, - * the application provides the value for the parameter source_timestamp that is made - * available to connected DataReader objects.
    - * This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * Topic Instance
    - * A TopicInstance encapsulates a sample and its associated - * @ref anchor_dds_pub_datawriter_write_instance_handle "instance handle". - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_write_blocking "write blocking"). - * - * @param begin an iterator pointing to the beginning of a sequence of - * TopicInstances - * @param end an iterator pointing to the end of a sequence of - * TopicInstances - * @param timestamp the time stamp - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - template - OMG_DDS_API void write( - const FWIterator& begin, - const FWIterator& end, - const dds::core::Time& timestamp); - - /** - * This operation writes a series of typed Samples and their parallel instance handles. - * - * Detailed Description
    - * It modifies the values of the given data instances. When this operation is used, - * the Data Distribution Service will automatically supply the value of the - * source_timestamp that is made available to connected DataReader objects.
    - * This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * Instance Handle
    - * See @ref anchor_dds_pub_datawriter_write_instance_handle "write instance handle". - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_write_blocking "write blocking"). - * - * @param data_begin an iterator pointing to the beginning of a sequence of samples - * @param data_end an iterator pointing to the end of a sequence of samples - * @param handle_begin an iterator pointing to the beginning of a sequence of InstanceHandles - * @param handle_end an iterator pointing to the end of a sequence of InstanceHandles - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - template< - typename SamplesFWIterator, - typename HandlesFWIterator> - OMG_DDS_API void write( - const SamplesFWIterator& data_begin, - const SamplesFWIterator& data_end, - const HandlesFWIterator& handle_begin, - const HandlesFWIterator& handle_end); - - /** - * This operation writes a series of typed Samples or TopicInstances and provides - * a value for the source_timestamp for these samples explicitly. - * - * Detailed Description
    - * It modifies the values of the given data instances. When this operation is used, - * the application provides the value for the parameter source_timestamp that is made - * available to connected DataReader objects.
    - * This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * Instance Handle
    - * See @ref anchor_dds_pub_datawriter_write_instance_handle "write instance handle". - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_write_blocking "write blocking"). - * - * @param data_begin an iterator pointing to the beginning of a sequence of samples - * @param data_end an iterator pointing to the end of a sequence of samples - * @param handle_begin an iterator pointing to the beginning of a sequence of InstanceHandles - * @param handle_end an iterator pointing to the end of a sequence of InstanceHandles - * @param timestamp the time stamp - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - template< - typename SamplesFWIterator, - typename HandlesFWIterator> - OMG_DDS_API void write( - const SamplesFWIterator& data_begin, - const SamplesFWIterator& data_end, - const HandlesFWIterator& handle_begin, - const HandlesFWIterator& handle_end, - const dds::core::Time& timestamp); - - - /** @copydoc dds::pub::DataWriter::write(const T& data) */ - OMG_DDS_API DataWriter& operator <<( - const T& data); - - /** @copydoc dds::pub::DataWriter::write(const T& sample, const dds::core::Time& timestamp) */ - OMG_DDS_API DataWriter& operator <<( - const std::pair& data); - - /** @copydoc dds::pub::DataWriter::write(const T& sample, const ::dds::core::InstanceHandle& instance) */ - OMG_DDS_API DataWriter& operator <<( - const std::pair& data); - - /** @cond - * This can be useful for the DataReader (see fi MaxSamplesManipulatorFunctor), but not - * really for the DataWriter. Leave it from the API documentation for clarity. - */ - OMG_DDS_API DataWriter& operator <<( - DataWriter& (*manipulator)(DataWriter&)); - /** @endcond */ - - //========================================================================== - //== Instance Management - - /** - * This operation informs the Data Distribution Service that the application will be - * modifying a particular instance. - * - * Detailed Description
    - * This operation informs the Data Distribution Service that the application will be - * modifying a particular instance. This operation may be invoked prior to calling any - * operation that modifies the instance, such as write, unregister_instance or - * dispose_instance.
    - * When the application does register the instance before modifying, the Data - * Distribution Service will handle the instance more efficiently. It takes as a parameter - * (instance_data) an instance (to get the key value) and returns a handle that can - * be used in successive DataWriter operations. In case of an error, a HANDLE_NIL - * handle (InstanceHandle.is_nil() == true) is returned. - * - * The explicit use of this operation is optional as the application can directly call the - * write, unregister_instance or dispose_instance operations without InstanceHandle, - * which indicate that the sample should be examined to identify the instance. - * - * When this operation is used, the Data Distribution Service will automatically supply - * the value of the source_timestamp that is made available to connected - * DataReader objects.
    - * This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * @anchor anchor_dds_pub_datawriter_register_blocking - * Blocking
    - * If the dds::core::policy::History QosPolicy is set to KEEP_ALL, the register_instance - * operation on the DataWriter may block if the modification would cause data to be - * lost because one of the limits, specified in the dds::core::policy::ResourceLimits, is - * exceeded. In case the synchronous attribute value of the - * dds::core::policy::Reliability is set to TRUE for communicating DataWriters and - * DataReaders then the DataWriter will wait until all synchronous - * DataReaders have acknowledged the data. Under these circumstances, the - * max_blocking_time attribute of the dds::core::policy::Reliability configures the - * maximum time the register operation may block (either waiting for space to become - * available or data to be acknowledged). If max_blocking_time elapses before the - * DataWriter is able to store the modification without exceeding the limits and all - * expected acknowledgements are received, the register_instance operation will fail - * will return a nil InstanceHandle. - * - * Multiple Calls
    - * If this operation is called for an already registered instance, it just returns the already - * allocated instance handle. This may be used to look up and retrieve the handle - * allocated to a given instance. - * - * Key
    - * The key is a typed Sample of which the key fields are set so that the instance - * can be identified. - * - * @param key the key of the instance to register - * @return the instance handle - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - */ - OMG_DDS_API const ::dds::core::InstanceHandle register_instance( - const T& key); - - /** - * This operation will inform the Data Distribution Service that the application will be - * modifying a particular instance and provides a value for the source_timestamp - * explicitly. - * - * Detailed Description
    - * This operation informs the Data Distribution Service that the application will be - * modifying a particular instance. This operation may be invoked prior to calling any - * operation that modifies the instance, such as write, unregister_instance or - * dispose_instance.
    - * When the application does register the instance before modifying, the Data - * Distribution Service will handle the instance more efficiently. It takes as a parameter - * (instance_data) an instance (to get the key value) and returns a handle that can - * be used in successive DataWriter operations. In case of an error, a HANDLE_NIL - * handle (InstanceHandle.is_nil() == true) is returned. - * - * The explicit use of this operation is optional as the application can directly call the - * write, unregister_instance or dispose_instance operations without InstanceHandle, - * which indicate that the sample should be examined to identify the instance. - * - * When this operation is used, the application provides the value for the parameter - * source_timestamp that is made available to connected DataReader objects.
    - * This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_register_blocking "register blocking"). - * - * Multiple Calls
    - * If this operation is called for an already registered instance, it just returns the already - * allocated instance handle. The source_timestamp is ignored in that case. - * - * Key
    - * The key is a typed Sample of which the key fields are set so that the instance - * can be identified. - * - * @param key the key of the instance to register - * @param timestamp the timestamp used for registration - * @return the instance handle - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - */ - OMG_DDS_API const ::dds::core::InstanceHandle register_instance( - const T& key, - const dds::core::Time& timestamp); - - /** - * This operation informs the Data Distribution Service that the application will not be - * modifying a particular instance any more. - * - * Detailed Description
    - * This operation informs the Data Distribution Service that the application will not be - * modifying a particular instance any more. Therefore, this operation reverses the - * action of @ref dds::pub::DataWriter::register_instance(const T& key) "\"register_instance\"" or - * @ref dds::pub::DataWriter::register_instance(const T& key, const dds::core::Time& timestamp) "\"register_instance_w_timestamp\"". - * register_instance or register_instance_w_timestamp.
    - * It should only be called on an instance that is currently registered. This operation - * should be called just once per instance, regardless of how many times - * @ref dds::pub::DataWriter::register_instance(const T& key) "register_instance" was called - * for that instance.
    - * This operation also indicates - * that the Data Distribution Service can locally remove all information regarding that - * instance. The application should not attempt to use the handle, previously - * allocated to that instance, after calling this operation. - * - * When this operation is used, the Data Distribution Service will automatically supply - * the value of the source_timestamp that is made available to connected - * DataReader objects. This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * @anchor anchor_dds_pub_datawriter_unregister_effects - * Effects
    - * If, after unregistering, the application wants to modify (write or dispose) the - * instance, it has to register the instance again, or it has to use the default - * instance handle (InstanceHandle.is_nil() == true). - * This operation does not indicate that the instance should be deleted (that is the - * purpose of the @ref dds::pub::DataWriter::dispose_instance(const T& key) "dispose". - * This operation just indicates that the DataWriter no longer - * has “anything to say” about the instance. If there is no other DataWriter that - * has registered the instance as well, then the dds::sub::status::InstanceState in all - * connected DataReaders will be changed to not_alive_no_writers, provided this - * InstanceState was not already set to not_alive_disposed. In the last case the - * InstanceState will not be effected by the unregister_instance call, - * see also @ref DCPS_Modules_Subscription_SampleInfo "Sample info concept". - * - * This operation can affect the ownership of the data instance. If the - * DataWriter was the exclusive owner of the instance, calling this operation will - * release that ownership, meaning ownership may be transferred to another, - * possibly lower strength, DataWriter. - * - * The operation must be called only on registered instances. Otherwise the operation - * trow PreconditionNotMetError. - * - * @anchor anchor_dds_pub_datawriter_unregister_blocking - * Blocking
    - * If the dds::core::policy::History QosPolicy is set to KEEP_ALL, the unregister_instance - * operation on the DataWriter may block if the modification would cause data to be - * lost because one of the limits, specified in the dds::core::policy::ResourceLimits, is - * exceeded. In case the synchronous attribute value of the - * dds::core::policy::Reliability is set to TRUE for communicating DataWriters and - * DataReaders then the DataWriter will wait until all synchronous - * DataReaders have acknowledged the data. Under these circumstances, the - * max_blocking_time attribute of the dds::core::policy::Reliability configures the - * maximum time the unregister operation may block (either waiting for space to become - * available or data to be acknowledged). If max_blocking_time elapses before the - * DataWriter is able to store the modification without exceeding the limits and all - * expected acknowledgements are received, the unregister_instance operation will fail - * and throw TimeoutError. - * - * @param i the instance to unregister - * @return a reference to the DataWriter - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - OMG_DDS_API DataWriter& unregister_instance( - const ::dds::core::InstanceHandle& i); - - /** - * This operation will inform the Data Distribution Service that the application will not - * be modifying a particular instance any more and provides a value for the - * source_timestamp explicitly. - * - * Detailed Description
    - * This operation informs the Data Distribution Service that the application will not be - * modifying a particular instance any more. Therefore, this operation reverses the - * action of @ref dds::pub::DataWriter::register_instance(const T& key) "\"register_instance\"" or - * @ref dds::pub::DataWriter::register_instance(const T& key, const dds::core::Time& timestamp) "\"register_instance_w_timestamp\"". - * register_instance or register_instance_w_timestamp.
    - * It should only be called on an instance that is currently registered. This operation - * should be called just once per instance, regardless of how many times - * @ref dds::pub::DataWriter::register_instance(const T& key) "register_instance" was called - * for that instance.
    - * This operation also indicates - * that the Data Distribution Service can locally remove all information regarding that - * instance. The application should not attempt to use the handle, previously - * allocated to that instance, after calling this operation. - * - * When this operation is used, the application itself supplied - * the value of the source_timestamp that is made available to connected - * DataReader objects. This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * Effects
    - * See @ref anchor_dds_pub_datawriter_unregister_effects "here" for the unregister effects. - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_unregister_blocking "unregister blocking"). - * - * @param i the instance to unregister - * @param timestamp the timestamp - * @return a reference to the DataWriter - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - OMG_DDS_API DataWriter& unregister_instance( - const ::dds::core::InstanceHandle& i, - const dds::core::Time& timestamp); - - /** - * This operation informs the Data Distribution Service that the application will not be - * modifying a particular instance any more. - * - * Detailed Description
    - * This operation informs the Data Distribution Service that the application will not be - * modifying a particular instance any more. Therefore, this operation reverses the - * action of @ref dds::pub::DataWriter::register_instance(const T& key) "\"register_instance\"" or - * @ref dds::pub::DataWriter::register_instance(const T& key, const dds::core::Time& timestamp) "\"register_instance_w_timestamp\"". - * register_instance or register_instance_w_timestamp.
    - * It should only be called on an instance that is currently registered. This operation - * should be called just once per instance, regardless of how many times - * @ref dds::pub::DataWriter::register_instance(const T& key) "register_instance" was called - * for that instance.
    - * This operation also indicates - * that the Data Distribution Service can locally remove all information regarding that - * instance. The application should not attempt to use the handle, previously - * allocated to that instance, after calling this operation. - * - * When this operation is used, the Data Distribution Service will automatically supply - * the value of the source_timestamp that is made available to connected - * DataReader objects. This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * Effects
    - * See @ref anchor_dds_pub_datawriter_unregister_effects "here" for the unregister effects. - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_unregister_blocking "unregister blocking"). - * - * Instance
    - * The instance is identified by the key fields of the given typed data sample, instead - * of an InstanceHandle. - * - * @param key sample of the instance to dispose - * @return a reference to the DataWriter - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - OMG_DDS_API DataWriter& unregister_instance( - const T& key); - - /** - * This operation will inform the Data Distribution Service that the application will not - * be modifying a particular instance any more and provides a value for the - * source_timestamp explicitly. - * - * Detailed Description
    - * This operation informs the Data Distribution Service that the application will not be - * modifying a particular instance any more. Therefore, this operation reverses the - * action of @ref dds::pub::DataWriter::register_instance(const T& key) "\"register_instance\"" or - * @ref dds::pub::DataWriter::register_instance(const T& key, const dds::core::Time& timestamp) "\"register_instance_w_timestamp\"". - * register_instance or register_instance_w_timestamp.
    - * It should only be called on an instance that is currently registered. This operation - * should be called just once per instance, regardless of how many times - * @ref dds::pub::DataWriter::register_instance(const T& key) "register_instance" was called - * for that instance.
    - * This operation also indicates - * that the Data Distribution Service can locally remove all information regarding that - * instance. The application should not attempt to use the handle, previously - * allocated to that instance, after calling this operation. - * - * When this operation is used, the application itself supplied - * the value of the source_timestamp that is made available to connected - * DataReader objects. This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * Effects
    - * See @ref anchor_dds_pub_datawriter_unregister_effects "here" for the unregister effects. - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_unregister_blocking "unregister blocking"). - * - * Instance
    - * The instance is identified by the key fields of the given typed data sample, instead - * of an InstanceHandle. - * - * @param key sample of the instance to dispose - * @param timestamp the timestamp - * @return a reference to the DataWriter - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - OMG_DDS_API DataWriter& unregister_instance( - const T& key, - const dds::core::Time& timestamp); - - /** - * This operation requests the Data Distribution Service to mark the instance for - * deletion. - * - * Detailed Description
    - * This operation requests the Data Distribution Service to mark the instance for - * deletion. Copies of the instance and its corresponding samples, which are stored in - * every connected DataReader and, dependent on the QosPolicy settings, also in - * the Transient and Persistent stores, will be marked for deletion by setting their - * dds::sub::status::InstanceState to not_alive_disposed state. - * - * When this operation is used, the Data Distribution Service will automatically supply - * the value of the source_timestamp that is made available to connected - * DataReader objects. This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * @anchor anchor_dds_pub_datawriter_dispose_effect_readers - * Effects on DataReaders
    - * Actual deletion of the instance administration in a connected DataReader will be - * postponed until the following conditions have been met: - * - the instance must be unregistered (either implicitly or explicitly) by all connected - * DataWriters that have previously registered it. - * - A DataWriter can register an instance explicitly by using the special - * register_instance operations. - * - A DataWriter can register an instance implicitly by using no or the default (nil) - * InstanceHandle in any of the other DataWriter operations. - * - A DataWriter can unregister an instance explicitly by using one of the special - * unregister_instance operations. - * - A DataWriter will unregister all its contained instances implicitly when it is - * deleted. - * - When a DataReader detects a loss of liveliness in one of its connected - * DataWriters, it will consider all instances registered by that DataWriter as - * being implicitly unregistered. - * - and the application must have consumed all samples belonging to the instance, - * either implicitly or explicitly. - * - An application can consume samples explicitly by invoking the take operation, - * or one of its variants, on its DataReaders. - * - The DataReader can consume disposed samples implicitly when the - * autopurge_disposed_samples_delay of the ReaderData - * Lifecycle QosPolicy has expired. - * - * The DataReader may also remove instances that haven’t been disposed first: this - * happens when the autopurge_nowriter_samples_delay of the - * ReaderDataLifecycle QosPolicy has expired after the instance is considered - * unregistered by all connected DataWriters (i.e. when it has a - * InstanceState of not_alive_no_writers.
    - * See also dds::core::policy::ReaderDataLifecycle QosPolicy. - * - * @anchor anchor_dds_pub_datawriter_dispose_effect_stores - * Effects on Transient/Persistent Stores
    - * Actual deletion of the instance administration in the connected Transient and - * Persistent stores will be postponed until the following conditions have been met: - * - the instance must be unregistered (either implicitly or explicitly) by all connected - * DataWriters that have previously registered it. (See above.) - * - and the period of time specified by the service_cleanup_delay attribute in - * the DurabilityServiceQosPolicy on the Topic must have elapsed after the - * instance is considered unregistered by all connected DataWriters. - * - * See also dds::core::policy::Durability QosPolicy. - * - * Instance Handle
    - * If handle is not nil, it must correspond to the value returned by - * @ref dds::pub::DataWriter::register_instance(const T& key) "\"register_instance\"" or - * @ref dds::pub::DataWriter::register_instance(const T& key, const dds::core::Time& timestamp) "\"register_instance_w_timestamp\"" - * when the instance (identified by its key) was registered. Passing such a registered - * handle helps the Data Distribution Service to process the sample more efficiently. - * - * @anchor anchor_dds_pub_datawriter_dispose_blocking - * Blocking
    - * If the dds::core::policy::History QosPolicy is set to KEEP_ALL, the dispose - * operation on the DataWriter may block if the modification would cause data to be - * lost because one of the limits, specified in the dds::core::policy::ResourceLimits, is - * exceeded. In case the synchronous attribute value of the - * dds::core::policy::Reliability is set to TRUE for communicating DataWriters and - * DataReaders then the DataWriter will wait until all synchronous - * DataReaders have acknowledged the data. Under these circumstances, the - * max_blocking_time attribute of the dds::core::policy::Reliability configures the - * maximum time the dispose operation may block (either waiting for space to become - * available or data to be acknowledged). If max_blocking_time elapses before the - * DataWriter is able to store the modification without exceeding the limits and all - * expected acknowledgements are received, the dispose operation will fail and throw - * TimeoutError. - * - * @param i the instance to dispose - * @return a reference to the DataWriter - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - OMG_DDS_API DataWriter& dispose_instance( - const ::dds::core::InstanceHandle& i); - - /** - * This operation requests the Data Distribution Service to mark the instance for - * deletion and provides a value for the source_timestamp explicitly. - * - * Detailed Description
    - * This operation requests the Data Distribution Service to mark the instance for - * deletion. Copies of the instance and its corresponding samples, which are stored in - * every connected DataReader and, dependent on the QosPolicy settings, also in - * the Transient and Persistent stores, will be marked for deletion by setting their - * dds::sub::status::InstanceState to not_alive_disposed state. - * - * When this operation is used, the application explicitly supplies - * the value of the source_timestamp that is made available to connected - * DataReader objects. This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * Effects
    - * This operation @ref anchor_dds_pub_datawriter_dispose_effect_readers "effects DataReaders" - * and @ref anchor_dds_pub_datawriter_dispose_effect_stores "effects Transient/Persistent Stores". - * - * Instance Handle
    - * If handle is not nil, it must correspond to the value returned by - * @ref dds::pub::DataWriter::register_instance(const T& key) "\"register_instance\"" or - * @ref dds::pub::DataWriter::register_instance(const T& key, const dds::core::Time& timestamp) "\"register_instance_w_timestamp\"" - * when the instance (identified by its key) was registered. Passing such a registered - * handle helps the Data Distribution Service to process the sample more efficiently. - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_dispose_blocking "dispose blocking"). - * - * - * @param i the instance to dispose - * @param timestamp the timestamp - * @return a reference to the DataWriter - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - OMG_DDS_API DataWriter& dispose_instance( - const ::dds::core::InstanceHandle& i, - const dds::core::Time& timestamp); - - /** - * This operation requests the Data Distribution Service to mark the instance for - * deletion. - * - * Detailed Description
    - * This operation requests the Data Distribution Service to mark the instance for - * deletion. Copies of the instance and its corresponding samples, which are stored in - * every connected DataReader and, dependent on the QosPolicy settings, also in - * the Transient and Persistent stores, will be marked for deletion by setting their - * dds::sub::status::InstanceState to not_alive_disposed state. - * - * When this operation is used, the Data Distribution Service will automatically supply - * the value of the source_timestamp that is made available to connected - * DataReader objects. This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * Effects
    - * This operation @ref anchor_dds_pub_datawriter_dispose_effect_readers "effects DataReaders" - * and @ref anchor_dds_pub_datawriter_dispose_effect_stores "effects Transient/Persistent Stores". - * - * Instance
    - * The instance is identified by the key fields of the given typed data sample, instead - * of an InstanceHandle. - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_dispose_blocking "dispose blocking"). - * - * @param key sample of the instance to dispose - * @return a reference to the DataWriter - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - OMG_DDS_API DataWriter& dispose_instance( - const T& key); - - /** - * This operation requests the Data Distribution Service to mark the instance for - * deletion and provides a value for the source_timestamp explicitly. - * - * Detailed Description
    - * This operation requests the Data Distribution Service to mark the instance for - * deletion. Copies of the instance and its corresponding samples, which are stored in - * every connected DataReader and, dependent on the QosPolicy settings, also in - * the Transient and Persistent stores, will be marked for deletion by setting their - * dds::sub::status::InstanceState to not_alive_disposed state. - * - * When this operation is used, the application explicitly supplies - * the value of the source_timestamp that is made available to connected - * DataReader objects. This timestamp is important for the interpretation of the - * dds::core::policy::DestinationOrder QosPolicy. - * - * As a side effect, this operation asserts liveliness on the DataWriter itself and on - * the containing DomainParticipant. - * - * Effects
    - * This operation @ref anchor_dds_pub_datawriter_dispose_effect_readers "effects DataReaders" - * and @ref anchor_dds_pub_datawriter_dispose_effect_stores "effects Transient/Persistent Stores". - * - * Instance
    - * The instance is identified by the key fields of the given typed data sample, instead - * of an InstanceHandle. - * - * Blocking
    - * This operation can be blocked (see @ref anchor_dds_pub_datawriter_dispose_blocking "dispose blocking"). - * - * @param key sample of the instance to dispose - * @param timestamp the timestamp - * @return a reference to the DataWriter - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - * @throws dds::core::TimeoutError - * Either the current action overflowed the available resources - * as specified by the combination of the Reliability QosPolicy, - * History QosPolicy and ResourceLimits QosPolicy, or the current action - * was waiting for data delivery acknowledgement by synchronous DataReaders. - * This caused blocking of the write operation, which could not be resolved before - * max_blocking_time of the Reliability QosPolicy elapsed. - */ - OMG_DDS_API DataWriter& dispose_instance( - const T& key, - const dds::core::Time& timestamp); - - /** - * This operation retrieves the key value of a specific instance. - * - * This operation can be used to retrieve the instance key that corresponds - * to an instance_handle. The operation will only fill the fields that form - * the key inside the sample instance. - * - * This operation may raise a InvalidArgumentError exception if the InstanceHandle - * does not correspond to an existing data-object known to the DataWriter. - * If the implementation is not able to check invalid handles, then the - * result in this situation is unspecified. - * - * The TopicInstance is added as parameter to be able to overload this operation. - * - * @param[out] i A topic instance to set the handle and sample key fields of - * @param[in] h The instance handle - * @return The given topic instance with the handle and key fields set - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::InvalidArgumentError - * The InstanceHandle is not a valid handle. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - */ - // dds::topic::TopicInstance& key_value( - // dds::topic::TopicInstance& i, - // const ::dds::core::InstanceHandle& h); - - /** - * This operation retrieves the key value of a specific instance. - * - * This operation can be used to retrieve the instance key that corresponds - * to an instance_handle. The operation will only fill the fields that form - * the key inside the sample instance. - * - * This operation may raise a InvalidArgumentError exception if the InstanceHandle - * does not correspond to an existing data-object known to the DataWriter. - * If the implementation is not able to check invalid handles, then the - * result in this situation is unspecified. - * - * The Sample is added as parameter to be able to overload this operation. - * - * @param[out] sample A sample to set the key fields of - * @param[in] h The instance handle - * @return The given sample with the key fields set - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::InvalidArgumentError - * The InstanceHandle is not a valid handle. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::NotEnabledError - * The DataWriter has not yet been enabled. - * @throws dds::core::PreconditionNotMetError - * The handle has not been registered with this DataWriter. - */ - OMG_DDS_API T& key_value( - T& sample, - const ::dds::core::InstanceHandle& h); - - /** - * This operation returns the value of the instance handle which corresponds - * to the instance_data. - * - * The instance_data parameter is only used for the purpose of - * examining the fields that define the key. The instance handle can be used in any - * write, dispose or unregister operations (or their time stamped variants) that - * operate on a specific instance. Note that DataWriter instance handles are local, - * and are not interchangeable with DataReader instance handles nor with instance - * handles of an other DataWriter. - * - * This operation does not register the instance in question. If the instance has not been - * previously registered or if for any other - * reason the Service is unable to provide an instance handle, the Service will return - * the default nil handle (InstanceHandle.is_nil() == true). - * - * @param key the sample - * @return the instance handle - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - */ - OMG_DDS_API dds::core::InstanceHandle lookup_instance( - const T& key); - - //========================================================================== - //== QoS Management - - /** @copydoc dds::pub::TAnyDataWriter::qos(const dds::pub::qos::DataWriterQos& qos) */ - OMG_DDS_API DataWriter& operator <<( - const qos::DataWriterQos& qos); - - - //========================================================================== - //== Entity Navigation - - /** - * Get the Topic associated with this DataWriter. - * - * @return the Topic - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - */ - // const dds::topic::Topic& topic() const; - - //========================================================================== - //== Listeners Management - - /** - * Register a listener with the DataWriter. - * - * This operation attaches a DataWriterListener to the DataWriter. Only one - * DataWriterListener can be attached to each DataWriter. If a - * DataWriterListener was already attached, the operation will replace it with the - * new one. When the listener is the NULL pointer, it represents a listener that is - * treated as a NOOP for all statuses activated in the bit mask. - * - * Listener un-registration is performed by setting the listener to NULL and mask none(). - * - * @anchor anchor_dds_pub_datawriter_commstatus - * Communication Status
    - * For each communication status, the StatusChangedFlag flag is initially set to - * FALSE. It becomes TRUE whenever that communication status changes. For each - * communication status activated in the mask, the associated DataWriterListener - * operation 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__status from inside the listener it will see the status - * already reset. An exception to this rule is the NULL listener, which does not reset the - * communication statuses for which it is invoked. - * - * The following statuses are applicable to the DataWriterListener: - * - dds::core::status::StatusMask::offered_deadline_missed() - * - dds::core::status::StatusMask::offered_incompatible_qos() - * - dds::core::status::StatusMask::liveliness_lost() - * - dds::core::status::StatusMask::publication_matched() - * - * Be aware that the PUBLICATION_MATCHED_STATUS is not applicable when the - * infrastructure does not have the information available to determine connectivity. - * This is the case when OpenSplice is configured not to maintain discovery - * information in the Networking Service. (See the description for the - * NetworkingService/Discovery/enabled property in the Deployment - * Manual for more information about this subject.) In this case the operation will - * throw UnsupportedError. - * - * Status bits are declared as a constant and can be used by the application in an OR - * operation to create a tailored mask. The special constant dds::core::status::StatusMask::none() - * can be used to indicate that the created entity should not respond to any of its available - * statuses. The DDS will therefore attempt to propagate these statuses to its factory. - * The special constant dds::core::status::StatusMask::all() can be used to select all applicable - * statuses specified in the “Data Distribution Service for Real-time Systems Version - * 1.2” specification which are applicable to the PublisherListener. - * - * @anchor anchor_dds_pub_datawriter_commpropagation - * Status Propagation
    - * In case a communication status is not activated in the mask of the - * DataWriterListener, the PublisherListener of the containing Publisher - * is invoked (if attached and activated for the status that occurred). This allows the - * application to set a default behaviour in the PublisherListener of the containing - * Publisher and a DataWriter specific behaviour when needed. In case the - * communication status is not activated in the mask of the PublisherListener as - * well, the communication status will be propagated to the - * DomainParticipantListener of the containing DomainParticipant. In case - * the DomainParticipantListener is also not attached or the communication - * status is not activated in its mask, the application is not notified of the change. - * - * See also @ref DCPS_Modules_Infrastructure_Listener "listener information". - * - * @param listener the listener - * @param mask the mask defining the events for which the listener - * will be notified. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::UnsupportedError - * A status was selected that cannot be supported because - * the infrastructure does not maintain the required connectivity information. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API void listener( - DataWriterListener* listener, - const ::dds::core::status::StatusMask& mask); - - /** - * Get the listener of this DataWriter. - * - * See also @ref DCPS_Modules_Infrastructure_Listener "listener information". - * - * @return the listener - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - */ - OMG_DDS_API DataWriterListener* listener() const; -}; - -} //namespace pub -} //namespace dds - -#endif //OMG_DDS_PUB_DATA_WRITER_HPP_ diff --git a/include/dds/pub/Publisher.hpp b/include/dds/pub/Publisher.hpp deleted file mode 100644 index 9b1bd7a6444..00000000000 --- a/include/dds/pub/Publisher.hpp +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_PUB_PUBLISHER_HPP_ -#define OMG_DDS_PUB_PUBLISHER_HPP_ - -#include - -#include -#include -#include -#include - -namespace dds { -namespace pub { - -class PublisherListener; - -/** - * @brief - * The Publisher acts on the behalf of one or several DataWriter objects - * that belong to it. - * - * When it is informed of a change to the data associated - * with one of its DataWriter objects, it decides when it is appropriate - * to actually send the data-update message. In making this decision, it - * considers any extra information that goes with the data (timestamp, - * writer, etc.) as well as the QoS of the Publisher and the DataWriter. - * - * @see @ref DCPS_Modules_Publisher "Publisher" - */ -class Publisher : public dds::core::TEntity -{ -public: - - /** - * Local convenience typedef for dds::pub::PublisherListener. - */ - typedef PublisherListener Listener; - - OMG_DDS_REF_TYPE_PROTECTED_DC( - Publisher, - dds::core::TEntity, - detail::Publisher) - - OMG_DDS_IMPLICIT_REF_BASE( - Publisher) - - /** - * Create a new Publisher. - * - * The Publisher will be created with the QoS values specified on the last - * successful call to @link dds::domain::DomainParticipant::default_publisher_qos(const ::dds::pub::qos::PublisherQos& qos) - * dp.default_publisher_qos(qos) @endlink or, if the call was never made, the - * @ref anchor_dds_pub_publisher_qos_defaults "default" values. - * - * @param dp the domain participant - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API Publisher( - const dds::domain::DomainParticipant& dp); - - /** - * Create a new Publisher. - * - * The Publisher will be created with the given QosPolicy settings and if - * applicable, attaches the optionally specified PublisherListener to it. - * - * See @ref DCPS_Modules_Infrastructure_Listener "listener" for more information - * about listeners and possible status propagation to other entities. - * - * @param dp the domain participant to create the Publisher with. - * @param qos a collection of QosPolicy settings for the new Publisher. In case - * these settings are not self consistent, no Publisher is created. - * @param listener the publisher listener - * @param mask the mask of events notified to the listener - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::InconsistentPolicyError - * The parameter qos contains conflicting QosPolicy settings. - */ - OMG_DDS_API Publisher( - const dds::domain::DomainParticipant& dp, - const qos::PublisherQos& qos, - PublisherListener* listener = NULL, - const dds::core::status::StatusMask& mask = dds::core::status::StatusMask::none()); - - /** @cond */ - virtual OMG_DDS_API ~Publisher(); - /** @endcond */ - - //========================================================================== - - /** - * Gets the PublisherQos setting for this instance. - * - * @return the qos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API const qos::PublisherQos& qos() const; - - - /** - * Sets the PublisherQos setting for this instance. - * - * @param qos the qos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API void qos( - const qos::PublisherQos& qos); - - /** @copydoc dds::pub::Publisher::qos(const dds::pub::qos::PublisherQos& qos) */ - OMG_DDS_API Publisher& operator <<( - const qos::PublisherQos& qos); - - /** @copydoc dds::pub::Publisher::qos() */ - OMG_DDS_API Publisher& operator >>( - qos::PublisherQos& qos); - - /** - * Sets the default DataWriterQos of the Publisher. - * - * This operation sets the default SubscriberQos of the Publisher which - * is used for newly created Subscriber objects, when no QoS is provided. - * - * This operation checks if the DataWriterQos is self consistent. If it is not, the - * operation has no effect and throws dds::core::InconsistentPolicyError. - * - * The values set by this operation are returned by dds::pub::Publisher::default_datawriter_qos(). - * - * @param qos the default DataWriterQos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::UnsupportedError - * One or more of the selected QosPolicy values are - * currently not supported by OpenSplice. - * @throws dds::core::InconsistentPolicyError - * The parameter qos contains conflicting QosPolicy settings, - * e.g. a history depth that is higher than the specified resource limits. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API Publisher& default_datawriter_qos( - const qos::DataWriterQos& qos); - - /** - * Gets the default DataWriterQos of the Publisher. - * - * This operation gets an object with the default DataWriter QosPolicy settings of - * the Publisher (that is the DataWriterQos) which is used for newly - * created DataWriter objects, in case no QoS was provided during the creation. - * - * The values retrieved by this operation match the set of values specified on the last - * successful call to - * dds::pub::Publisher::default_datawriter_qos(const dds::pub::qos::DataWriterQos& qos), - * or, if the call was never made, the @ref anchor_dds_pub_datawriter_qos_defaults "default" values. - * - * @return the default DataWriterQos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API qos::DataWriterQos default_datawriter_qos() const; - - //========================================================================== - - /** - * Register a listener with the Publisher. - * - * The notifications received by the listener depend on the - * status mask with which it was registered. - * - * Listener un-registration is performed by setting the listener to NULL. - * - * See also @ref DCPS_Modules_Infrastructure_Listener "listener information". - * - * @param plistener the listener - * @param mask the mask defining the events for which the listener - * will be notified. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::UnsupportedError - * A status was selected that cannot be supported because - * the infrastructure does not maintain the required connectivity information. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API void listener( - Listener* plistener, - const dds::core::status::StatusMask& mask); - - /** - * Get the listener of this Publisher. - * - * See also @ref DCPS_Modules_Infrastructure_Listener "listener information". - * - * @return the listener - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - */ - OMG_DDS_API Listener* listener() const; - - //========================================================================== - - /** - * This operation blocks the calling thread until either all data written - * by the reliable DataWriter entities is acknowledged by all matched - * reliable DataReader entities, or else the duration specified by the - * timeout parameter elapses, whichever happens first. - * - * Data is acknowledged by the local infrastructure when it does not need to be stored - * in its DataWriter’s local history. When a locally-connected subscription (including - * the networking service) has no more resources to store incoming samples it will start - * to reject these samples, resulting in their source DataWriters to store them - * temporarily in their own local history to be retransmitted at a later moment in time.
    - * In such scenarios, the wait_for_acknowledgments operation will block until all - * contained DataWriters have retransmitted their entire history, which is therefore - * effectively empty, or until the max_wait timeout expires, whichever happens first. - * In the latter case it will throw dds::core::TimeoutError. - * - * - * Be aware that in case the operation returns normally, the data has only been - * acknowledged by the local infrastructure: it does not mean all remote subscriptions - * have already received the data. However, delivering the data to remote nodes is then - * the sole responsibility of the networking service: even when the publishing - * application would terminate, all data that has not yet been received may be - * considered ‘on-route’ and will therefore eventually arrive (unless the networking - * service itself will crash). In contrast, if a DataWriter would still have data in it’s - * local history buffer when it terminates, this data is considered ‘lost’. - * - * - * This operation is intended to be used only if one or more of the contained - * DataWriters has its ReliabilityQosPolicyKind set to RELIABLE. - * Otherwise the operation will return immediately, since best-effort DataWriters will - * never store rejected samples in their local history: - * they will just drop them and continue business as usual. - * - * @param timeout the time out duration - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::TimeoutError - * Not all data is acknowledged before timeout elapsed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API void wait_for_acknowledgments( - const dds::core::Duration& timeout); - - //========================================================================== - - /** - * Return the DomainParticipant that owns this Publisher. - * - * @return the DomainParticipant - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - */ - OMG_DDS_API const dds::domain::DomainParticipant& participant() const; - - const dds::domain::DomainParticipant* participant_; - -}; - -} //namespace pub -} //namespace dds - -#endif //OMG_DDS_PUB_PUBLISHER_HPP_ diff --git a/include/dds/pub/PublisherListener.hpp b/include/dds/pub/PublisherListener.hpp deleted file mode 100644 index 271c9455358..00000000000 --- a/include/dds/pub/PublisherListener.hpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_PUB_PUBLISHER_LISTENER_HPP_ -#define OMG_DDS_PUB_PUBLISHER_LISTENER_HPP_ - -// TODO Remove when PSM DDS Listeners are ready to be used. -#include - -// TODO uncomment when PSM DDS Listeners are ready to be used. -//#include - -namespace dds { -namespace pub { - -class PublisherListener; -class NoOpPublisherListener; - -/** - * @brief - * Publisher events Listener - * - * Since a Publisher is an Entity, it has the ability to have a Listener - * associated with it. In this case, the associated Listener should be of type - * PublisherListener. This interface must be implemented by the - * application. A user-defined class must be provided by the application which must - * extend from the PublisherListener class. - * - * - * All operations for this interface must be implemented in the user-defined class, it is - * up to the application whether an operation is empty or contains some functionality. - * - * - * The PublisherListener provides a generic mechanism (actually a - * callback function) for the Data Distribution Service to notify the application of - * relevant asynchronous status change events, such as a missed deadline, violation of - * a QosPolicy setting, etc. The PublisherListener is related to - * changes in communication status StatusConditions. - * - * @code{.cpp} - * // Application example listener - * class ExampleListener : - * public virtual dds::pub::PublisherListener - * { - * public: - * virtual void on_offered_deadline_missed ( - * dds::pub::AnyDataWriter& writer, - * const dds::core::status::OfferedDeadlineMissedStatus& status) - * { - * std::cout << "on_offered_deadline_missed" << std::endl; - * } - * - * virtual void on_offered_incompatible_qos ( - * dds::pub::AnyDataWriter& writer, - * const dds::core::status::OfferedIncompatibleQosStatus& status) - * { - * std::cout << "on_offered_incompatible_qos" << std::endl; - * } - * - * virtual void on_liveliness_lost ( - * dds::pub::AnyDataWriter& writer, - * const dds::core::status::LivelinessLostStatus& status) - * { - * std::cout << "on_liveliness_lost" << std::endl; - * } - * - * virtual void on_publication_matched ( - * dds::pub::AnyDataWriter& writer, - * const dds::core::status::PublicationMatchedStatus& status) - * { - * std::cout << "on_publication_matched" << std::endl; - * } - * }; - * - * // Create Publisher with the listener - * dds::domain::DomainParticipant participant(org::opensplice::domain::default_id()); - * dds::pub::Publisher publisher(participant, - * participant.default_publisher_qos(), - * new ExampleListener(), - * dds::core::status::StatusMask::all()); - * - * @endcode - * - * @see @ref DCPS_Modules_Publisher "Publisher" - * @see @ref DCPS_Modules_Infrastructure_Listener "Listener information" - */ -// TODO Uncomment when PSM listeners are implemented. -//class OMG_DDS_API PublisherListener : public virtual AnyDataWriterListener -// TODO Remove the PSM listeners are implemented. -class PublisherListener : public eprosima::fastdds::dds::PublisherListener -{ -public: - - /** @cond */ - virtual ~PublisherListener() - { - } - - /** @endcond */ -}; - -/** - * @brief - * Publisher events Listener - * - * This listener is just like PublisherListener, except - * that the application doesn't have to implement all operations. - * - * @code{.cpp} - * class ExampleListener : public virtual dds::pub::NoOpPublisherListener - * { - * // Not necessary to implement any Listener operations. - * }; - * @endcode - * - * @see dds::pub::PublisherListener - */ - -// TODO Uncomment when PSM DDS listeners are ready to be used -/* - class OMG_DDS_API NoOpPublisherListener : - public virtual PublisherListener, - public virtual NoOpAnyDataWriterListener - */ -// TODO Remove the PSM listeners are implemented. -class NoOpPublisherListener : public virtual PublisherListener -{ -public: - - /** @cond */ - virtual ~NoOpPublisherListener() - { - } - - /** @endcond */ -}; - -} //namespace pub -} //namespace dds - -#endif //OMG_DDS_PUB_PUBLISHER_LISTENER_HPP_ diff --git a/include/dds/pub/detail/AnyDataWriter.hpp b/include/dds/pub/detail/AnyDataWriter.hpp deleted file mode 100644 index 1a992ebd2d2..00000000000 --- a/include/dds/pub/detail/AnyDataWriter.hpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_PUB_DETAIL_ANYDATAWRITER_HPP_ -#define EPROSIMA_DDS_PUB_DETAIL_ANYDATAWRITER_HPP_ - -//TODO Remove this include when AnyDataWriter is implemented. -#include - -/** - * @cond - * Ignore this file in the API - */ - -namespace dds { -namespace pub { -namespace detail { - -using AnyDataWriter = eprosima::fastdds::dds::DataWriter; - -} //namespace detail -} //namespace pub -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_PUB_DETAIL_ANYDATAWRITER_HPP_ diff --git a/include/dds/pub/detail/DataWriter.hpp b/include/dds/pub/detail/DataWriter.hpp deleted file mode 100644 index 18fae527578..00000000000 --- a/include/dds/pub/detail/DataWriter.hpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_PUB_DETAIL_DATA_WRITER_HPP_ -#define EPROSIMA_DDS_PUB_DETAIL_DATA_WRITER_HPP_ - -#include - -/** - * @cond - * Ignore this file in the API - */ - -namespace dds { -namespace pub { -namespace detail { - -using DataWriter = eprosima::fastdds::dds::DataWriter; - -} //namespace detail -} //namespace pub -} //namespace dds - -/** @endcond */ - - -#endif //EPROSIMA_DDS_PUB_DETAIL_DATA_WRITER_HPP_ diff --git a/include/dds/pub/detail/Publisher.hpp b/include/dds/pub/detail/Publisher.hpp deleted file mode 100644 index 1ebe827764e..00000000000 --- a/include/dds/pub/detail/Publisher.hpp +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_PUB_DETAIL_PUBLISHER_HPP_ -#define EPROSIMA_DDS_PUB_DETAIL_PUBLISHER_HPP_ - -#include - -/** - * @cond - * Ignore this file in the API - */ - -namespace eprosima { -namespace fastdds { -namespace dds { -class Publisher; -} -} -} - -namespace dds { -namespace pub { -namespace detail { - -using Publisher = eprosima::fastdds::dds::Publisher; - -} //namespace detail -} //namespace pub -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_PUB_DETAIL_PUBLISHER_HPP_ diff --git a/include/dds/pub/qos/DataWriterQos.hpp b/include/dds/pub/qos/DataWriterQos.hpp deleted file mode 100644 index 857c43e8284..00000000000 --- a/include/dds/pub/qos/DataWriterQos.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_QOS_DATA_WRITER_QOS_HPP_ -#define OMG_DDS_QOS_DATA_WRITER_QOS_HPP_ - -#include - -namespace dds { -namespace pub { -namespace qos { - -typedef dds::pub::qos::detail::DataWriterQos DataWriterQos; - -} //namespace qos -} //namespace pub -} //namespace dds - -#endif //OMG_DDS_QOS_DATA_WRITER_QOS_HPP_ diff --git a/include/dds/pub/qos/PublisherQos.hpp b/include/dds/pub/qos/PublisherQos.hpp deleted file mode 100644 index adc2384054d..00000000000 --- a/include/dds/pub/qos/PublisherQos.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_QOS_PUBLISER_QOS_HPP_ -#define OMG_DDS_QOS_PUBLISER_QOS_HPP_ - -#include - -namespace dds { -namespace pub { -namespace qos { - -typedef dds::pub::qos::detail::PublisherQos PublisherQos; - -} //namespace qos -} //namespace pub -} //namespace dds - -#endif //OMG_DDS_QOS_PUBLISER_QOS_HPP_ diff --git a/include/dds/pub/qos/detail/DataWriterQos.hpp b/include/dds/pub/qos/detail/DataWriterQos.hpp deleted file mode 100644 index 7fe983c50b3..00000000000 --- a/include/dds/pub/qos/detail/DataWriterQos.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_PUB_QOS_DETAIL_DATAWRITER_QOS_HPP_ -#define EPROSIMA_DDS_PUB_QOS_DETAIL_DATAWRITER_QOS_HPP_ - -#include - -namespace dds { -namespace pub { -namespace qos { -namespace detail { - -using DataWriterQos = eprosima::fastdds::dds::DataWriterQos; - -} //namespace detail -} //namespace qos -} //namespace pub -} //namespace dds - -#endif //EPROSIMA_DDS_PUB_QOS_DETAIL_DATAWRITER_QOS_HPP_ diff --git a/include/dds/pub/qos/detail/PublisherQos.hpp b/include/dds/pub/qos/detail/PublisherQos.hpp deleted file mode 100644 index 666b871109d..00000000000 --- a/include/dds/pub/qos/detail/PublisherQos.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_PUB_QOS_DETAIL_PUBLISER_QOS_HPP_ -#define EPROSIMA_DDS_PUB_QOS_DETAIL_PUBLISER_QOS_HPP_ - -#include - -namespace dds { -namespace pub { -namespace qos { -namespace detail { - -using PublisherQos = eprosima::fastdds::dds::PublisherQos; - -} //namespace detail -} //namespace qos -} //namespace pub -} //namespace detail - -#endif //EPROSIMA_DDS_PUB_QOS_DETAIL_PUBLISER_QOS_HPP_ diff --git a/include/dds/sub/DataReader.hpp b/include/dds/sub/DataReader.hpp deleted file mode 100644 index 0ef7bb4e1d5..00000000000 --- a/include/dds/sub/DataReader.hpp +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_SUB_DATAREADER_HPP_ -#define OMG_DDS_SUB_DATAREADER_HPP_ - -#include - -#include -#include -#include - -namespace dds { -namespace sub { - -class DataReaderListener; - -//TODO: [ILG] Decide if we need to templatize the DataReader and derive from a AnyDataReader - -/** - * @brief - * A DataReader allows the application to declare the data it wishes to receive. - * - * @see @ref DCPS_Modules_Datareader "Datareader" - */ -class DataReader : public dds::core::TEntity -{ -public: - - /** - * Local convenience typedef for dds::pub::DataReaderListener. - */ - typedef DataReaderListener Listener; - - OMG_DDS_REF_TYPE_PROTECTED_DC( - DataReader, - dds::core::TEntity, - detail::DataReader) - - OMG_DDS_IMPLICIT_REF_BASE( - DataReader) - - /** - * Create a new DataReader. - * - * The DataReader will be created with the QoS values specified on the last - * successful call to @link dds::sub::Subscriber::default_DataReader_qos(const ::dds::sub::qos::DataReaderQos& qos) - * sub.default_DataReader_qos(qos) @endlink or, if the call was never made, the - * @ref anchor_dds_sub_DataReader_qos_defaults "default" values. - * - * @param sub the subscriber - * @param topic the topic the DataReader will be listening. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API DataReader( - const dds::sub::Subscriber& sub, - const dds::topic::Topic& topic); - - /** - * Create a new DataReader. - * - * The DataReader will be created with the given QosPolicy settings and if - * applicable, attaches the optionally specified DataReaderListener to it. - * - * See @ref DCPS_Modules_Infrastructure_Listener "listener" for more information - * about listeners and possible status propagation to other entities. - * - * @param sub the subscriber to create the DataReader with. - * @param topic the topic the DataReader will be listening. - * @param qos a collection of QosPolicy settings for the new DataReader. In case - * these settings are not self consistent, no DataReader is created. - * @param listener the DataReader listener - * @param mask the mask of events notified to the listener - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::InconsistentPolicyError - * The parameter qos contains conflicting QosPolicy settings. - */ - OMG_DDS_API DataReader( - const dds::sub::Subscriber& sub, - const dds::topic::Topic& topic, - const qos::DataReaderQos& qos, - DataReaderListener* listener = NULL, - const dds::core::status::StatusMask& mask = dds::core::status::StatusMask::none()); - - /** @cond */ - virtual OMG_DDS_API ~DataReader(); - /** @endcond */ - - //========================================================================== - - /** - * Gets the DataReaderQos setting for this instance. - * - * @return the qos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API const qos::DataReaderQos& qos() const; - - - /** - * Sets the DataReaderQos setting for this instance. - * - * @param qos the qos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API void qos( - const qos::DataReaderQos& qos); - - /** @copydoc dds::pub::DataReader::qos(const dds::pub::qos::DataReaderQos& qos) */ - OMG_DDS_API DataReader& operator <<( - const qos::DataReaderQos& qos); - - /** @copydoc dds::pub::DataReader::qos() */ - OMG_DDS_API DataReader& operator >>( - qos::DataReaderQos& qos); - - //========================================================================== - - /** - * Register a listener with the DataReader. - * - * The notifications received by the listener depend on the - * status mask with which it was registered. - * - * Listener un-registration is performed by setting the listener to NULL. - * - * See also @ref DCPS_Modules_Infrastructure_Listener "listener information". - * - * @param plistener the listener - * @param mask the mask defining the events for which the listener - * will be notified. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::UnsupportedError - * A status was selected that cannot be supported because - * the infrastructure does not maintain the required connectivity information. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API void listener( - Listener* plistener, - const dds::core::status::StatusMask& mask); - - /** - * Get the listener of this DataReader. - * - * See also @ref DCPS_Modules_Infrastructure_Listener "listener information". - * - * @return the listener - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - */ - OMG_DDS_API Listener* listener() const; - - /** - * Return the Subscriber that owns this DataReader. - * - * @return the Subscriber - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - */ - OMG_DDS_API const dds::sub::Subscriber& subscriber() const; - - dds::sub::Subscriber* subscriber_; - -}; - -} //namespace sub -} //namespace dds - -#endif //OMG_DDS_SUB_DATAREADER_HPP_ diff --git a/include/dds/sub/DataReaderListener.hpp b/include/dds/sub/DataReaderListener.hpp deleted file mode 100644 index a4a7f95728c..00000000000 --- a/include/dds/sub/DataReaderListener.hpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_SUB_DATAREADER_LISTENER_HPP_ -#define OMG_DDS_SUB_DATAREADER_LISTENER_HPP_ - -// TODO Remove when PSM DDS Listeners are ready to be used. -#include - -// TODO uncomment when PSM DDS Listeners are ready to be used. -//#include - -namespace dds { -namespace sub { - -class SubscriberListener; -class NoOpSubscriberListener; - -/** - * @brief - * DataReader events Listener - * - * Since a DataReader is an Entity, it has the ability to have a Listener - * associated with it. In this case, the associated Listener should be of type - * DataReaderListener. This interface must be implemented by the - * application. A user-defined class must be provided by the application which must - * extend from the DataReaderListener class. - * - * - * All operations for this interface must be implemented in the user-defined class, it is - * up to the application whether an operation is empty or contains some functionality. - * - * - * The DataReaderListener provides a generic mechanism (actually a - * callback function) for the Data Distribution Service to notify the application of - * relevant asynchronous status change events, such as a missed deadline, violation of - * a QosPolicy setting, etc. The DataReaderListener is related to - * changes in communication status StatusConditions. - */ -// TODO Uncomment when PSM listeners are implemented. -//class OMG_DDS_API DataReaderListener : public virtual AnyDataReaderListener -// TODO Remove the PSM listeners are implemented. -class DataReaderListener : public eprosima::fastdds::dds::DataReaderListener -{ -public: - - /** @cond */ - virtual ~DataReaderListener() - { - } - - /** @endcond */ -}; - -/** - * @brief - * DataReader events Listener - * - * This listener is just like DataReaderListener, except - * that the application doesn't have to implement all operations. - * - * @code{.cpp} - * class ExampleListener : public virtual dds::sub::NoOpDataReaderListener - * { - * // Not necessary to implement any Listener operations. - * }; - * @endcode - * - * @see dds::pub::DataReaderListener - */ - -// TODO Uncomment when PSM DDS listeners are ready to be used -/* - class OMG_DDS_API NoOpDataReaderListener : - public virtual DataReaderListener, - public virtual NoOpAnyDataReaderListener - */ -// TODO Remove the PSM listeners are implemented. -class NoOpDataReaderListener : public virtual DataReaderListener -{ -public: - - /** @cond */ - virtual ~NoOpDataReaderListener() - { - } - - /** @endcond */ -}; - -} //namespace sub -} //namespace dds - -#endif //OMG_DDS_SUB_DATAREADER_LISTENER_HPP_ diff --git a/include/dds/sub/Subscriber.hpp b/include/dds/sub/Subscriber.hpp deleted file mode 100644 index 38377d736a2..00000000000 --- a/include/dds/sub/Subscriber.hpp +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_SUB_SUBSCRIBER_HPP_ -#define OMG_DDS_SUB_SUBSCRIBER_HPP_ - -#include - -#include -#include -#include -#include - -namespace dds { -namespace sub { - -class SubscriberListener; - -/** - * @brief - * The Subscriber acts on the behalf of one or several DataReader objects - * that belong to it. - * - * @see @ref DCPS_Modules_Subscriber "Subscriber" - */ -class Subscriber : public dds::core::TEntity -{ -public: - - /** - * Local convenience typedef for dds::pub::SubscriberListener. - */ - typedef SubscriberListener Listener; - - OMG_DDS_REF_TYPE_PROTECTED_DC( - Subscriber, - dds::core::TEntity, - detail::Subscriber) - - OMG_DDS_IMPLICIT_REF_BASE( - Subscriber) - - /** - * Create a new Subscriber. - * - * The Subscriber will be created with the QoS values specified on the last - * successful call to @link dds::domain::DomainParticipant::default_subscriber_qos(const ::dds::pub::qos::SubscriberQos& qos) - * dp.default_subscriber_qos(qos) @endlink or, if the call was never made, the - * @ref anchor_dds_pub_subscriber_qos_defaults "default" values. - * - * @param dp the domain participant - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API Subscriber( - const dds::domain::DomainParticipant& dp); - - /** - * Create a new Subscriber. - * - * The Subscriber will be created with the given QosPolicy settings and if - * applicable, attaches the optionally specified SubscriberListener to it. - * - * See @ref DCPS_Modules_Infrastructure_Listener "listener" for more information - * about listeners and possible status propagation to other entities. - * - * @param dp the domain participant to create the Subscriber with. - * @param qos a collection of QosPolicy settings for the new Subscriber. In case - * these settings are not self consistent, no Subscriber is created. - * @param listener the subscriber listener - * @param mask the mask of events notified to the listener - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::InconsistentPolicyError - * The parameter qos contains conflicting QosPolicy settings. - */ - OMG_DDS_API Subscriber( - const dds::domain::DomainParticipant& dp, - const qos::SubscriberQos& qos, - SubscriberListener* listener = NULL, - const dds::core::status::StatusMask& mask = dds::core::status::StatusMask::none()); - - /** @cond */ - virtual OMG_DDS_API ~Subscriber(); - /** @endcond */ - - //========================================================================== - - /** - * Gets the SubscriberQos setting for this instance. - * - * @return the qos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API const qos::SubscriberQos& qos() const; - - - /** - * Sets the SubscriberQos setting for this instance. - * - * @param qos the qos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API void qos( - const qos::SubscriberQos& qos); - - /** @copydoc dds::pub::Subscriber::qos(const dds::pub::qos::SubscriberQos& qos) */ - OMG_DDS_API Subscriber& operator <<( - const qos::SubscriberQos& qos); - - /** @copydoc dds::pub::Subscriber::qos() */ - OMG_DDS_API Subscriber& operator >>( - qos::SubscriberQos& qos); - - /** - * Sets the default DataWriterQos of the Subscriber. - * - * This operation sets the default SubscriberQos of the Subscriber which - * is used for newly created Subscriber objects, when no QoS is provided. - * - * This operation checks if the DataReaderQos is self consistent. If it is not, the - * operation has no effect and throws dds::core::InconsistentPolicyError. - * - * The values set by this operation are returned by dds::pub::Subscriber::default_datareader_qos(). - * - * @param qos the default DataReaderQos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::UnsupportedError - * One or more of the selected QosPolicy values are - * currently not supported. - * @throws dds::core::InconsistentPolicyError - * The parameter qos contains conflicting QosPolicy settings, - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API Subscriber& default_datareader_qos( - const qos::DataReaderQos& qos); - - /** - * Gets the default DataReaderQos of the Subscriber. - * - * This operation gets an object with the default DataReader QosPolicy settings of - * the Subscriber (that is the DataReaderQos) which is used for newly - * created DataReader objects, in case no QoS was provided during the creation. - * - * The values retrieved by this operation match the set of values specified on the last - * successful call to - * dds::pub::Subscriber::default_datareader_qos(const dds::pub::qos::DataReaderQos& qos), - * or, if the call was never made, the @ref anchor_dds_pub_datareader_qos_defaults "default" values. - * - * @return the default DataReaderQos - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API qos::DataReaderQos default_datareader_qos() const; - - //========================================================================== - - /** - * Register a listener with the Subscriber. - * - * The notifications received by the listener depend on the - * status mask with which it was registered. - * - * Listener un-registration is performed by setting the listener to NULL. - * - * See also @ref DCPS_Modules_Infrastructure_Listener "listener information". - * - * @param plistener the listener - * @param mask the mask defining the events for which the listener - * will be notified. - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - * @throws dds::core::UnsupportedError - * A status was selected that cannot be supported because - * the infrastructure does not maintain the required connectivity information. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API void listener( - Listener* plistener, - const dds::core::status::StatusMask& mask); - - /** - * Get the listener of this Subscriber. - * - * See also @ref DCPS_Modules_Infrastructure_Listener "listener information". - * - * @return the listener - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - */ - OMG_DDS_API Listener* listener() const; - - /** - * Return the DomainParticipant that owns this Subscriber. - * - * @return the DomainParticipant - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::NullReferenceError - * The entity was not properly created and references to dds::core::null. - * @throws dds::core::AlreadyClosedError - * The entity has already been closed. - */ - OMG_DDS_API const dds::domain::DomainParticipant& participant() const; - - const dds::domain::DomainParticipant* participant_; - -}; - -} //namespace sub -} //namespace dds - -#endif //OMG_DDS_SUB_SUBSCRIBER_HPP_ diff --git a/include/dds/sub/SubscriberListener.hpp b/include/dds/sub/SubscriberListener.hpp deleted file mode 100644 index 2bea6ddca13..00000000000 --- a/include/dds/sub/SubscriberListener.hpp +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_SUB_SUBSCRIBER_LISTENER_HPP_ -#define OMG_DDS_SUB_SUBSCRIBER_LISTENER_HPP_ - -// TODO Remove when PSM DDS Listeners are ready to be used. -#include - -// TODO uncomment when PSM DDS Listeners are ready to be used. -//#include - -namespace dds { -namespace sub { - -class SubscriberListener; -class NoOpSubscriberListener; - -/** - * @brief - * Subscriber events Listener - * - * Since a Subscriber is an Entity, it has the ability to have a Listener - * associated with it. In this case, the associated Listener should be of type - * SubscriberListener. This interface must be implemented by the - * application. A user-defined class must be provided by the application which must - * extend from the SubscriberListener class. - * - * - * All operations for this interface must be implemented in the user-defined class, it is - * up to the application whether an operation is empty or contains some functionality. - * - * - * The SubscriberListener provides a generic mechanism (actually a - * callback function) for the Data Distribution Service to notify the application of - * relevant asynchronous status change events, such as a missed deadline, violation of - * a QosPolicy setting, etc. The SubscriberListener is related to - * changes in communication status StatusConditions. - * - * @code{.cpp} - * // Application example listener - * class ExampleListener : - * public virtual dds::sub::SubscriberListener - * { - * public: - * virtual void on_new_data_message ( - * dds::pub::AnyDataReader& reader, - * const dds::core::status::NewDataMessageStatus& status) - * { - * std::cout << "on_new_data_message" << std::endl; - * } - * - * virtual void on_subscription_matched ( - * dds::pub::AnyDataReader& reader, - * const dds::core::status::SubscriptionMatchedStatus& status) - * { - * std::cout << "on_subscription_matched" << std::endl; - * } - * - * virtual void on_requested_deadline_missed ( - * dds::pub::AnyDataReader& reader, - * const dds::core::status::RequestedDeadlineMissedStatus& status) - * { - * std::cout << "on_requested_deadline_missed" << std::endl; - * } - * - * virtual void on_liveliness_changed ( - * dds::pub::AnyDataReader& reader, - * const dds::core::status::LivelinessChangedStatus& status) - * { - * std::cout << "on_liveliness_changed" << std::endl; - * } - * }; - * - * // Create Publisher with the listener - * dds::domain::DomainParticipant participant(org::opensplice::domain::default_id()); - * dds::sub::Subscriber subscriber(participant, - * participant.default_Subscriber_qos(), - * new ExampleListener(), - * dds::core::status::StatusMask::all()); - * - * @endcode - * - * @see @ref DCPS_Modules_Subscriber "Subscriber" - * @see @ref DCPS_Modules_Infrastructure_Listener "Listener information" - */ -// TODO Uncomment when PSM listeners are implemented. -//class OMG_DDS_API SubscriberListener : public virtual AnyDataReaderListener -// TODO Remove the PSM listeners are implemented. -class SubscriberListener : public eprosima::fastdds::dds::SubscriberListener -{ -public: - - /** @cond */ - virtual ~SubscriberListener() - { - } - - /** @endcond */ -}; - -/** - * @brief - * Subscriber events Listener - * - * This listener is just like SubscriberListener, except - * that the application doesn't have to implement all operations. - * - * @code{.cpp} - * class ExampleListener : public virtual dds::sub::NoOpSubscriberListener - * { - * // Not necessary to implement any Listener operations. - * }; - * @endcode - * - * @see dds::pub::SubscriberListener - */ - -// TODO Uncomment when PSM DDS listeners are ready to be used -/* - class OMG_DDS_API NoOpSubscriberListener : - public virtual SubscriberListener, - public virtual NoOpAnySubscriberListener - */ -// TODO Remove the PSM listeners are implemented. -class NoOpSubscriberListener : public virtual SubscriberListener -{ -public: - - /** @cond */ - virtual ~NoOpSubscriberListener() - { - } - - /** @endcond */ -}; - -} //namespace sub -} //namespace dds - -#endif //OMG_DDS_SUB_SUBSCRIBER_LISTENER_HPP_ diff --git a/include/dds/sub/detail/DataReader.hpp b/include/dds/sub/detail/DataReader.hpp deleted file mode 100644 index d8ca18c75a2..00000000000 --- a/include/dds/sub/detail/DataReader.hpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_SUB_DETAIL_DATAREADER_HPP_ -#define EPROSIMA_DDS_SUB_DETAIL_DATAREADER_HPP_ - -#include - -/** - * @cond - * Ignore this file in the API - */ - -namespace dds { -namespace sub { -namespace detail { - -using DataReader = eprosima::fastdds::dds::DataReader; - -} //namespace detail -} //namespace sub -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_SUB_DETAIL_DATAREADER_HPP_ diff --git a/include/dds/sub/detail/Subscriber.hpp b/include/dds/sub/detail/Subscriber.hpp deleted file mode 100644 index 9a7a7fbb0e9..00000000000 --- a/include/dds/sub/detail/Subscriber.hpp +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_SUB_DETAIL_SUBSCRIBER_HPP_ -#define EPROSIMA_DDS_SUB_DETAIL_SUBSCRIBER_HPP_ - -#include - -/** - * @cond - * Ignore this file in the API - */ - -namespace eprosima { -namespace fastdds { -namespace dds { -class Subscriber; -} -} -} - -namespace dds { -namespace sub { -namespace detail { - -using Subscriber = eprosima::fastdds::dds::Subscriber; - -} //namespace detail -} //namespace sub -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_SUB_DETAIL_SUBSCRIBER_HPP_ diff --git a/include/dds/sub/qos/DataReaderQos.hpp b/include/dds/sub/qos/DataReaderQos.hpp deleted file mode 100644 index 1c601ea3d92..00000000000 --- a/include/dds/sub/qos/DataReaderQos.hpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_QOS_DATA_READER_QOS_HPP_ -#define OMG_DDS_QOS_DATA_READER_QOS_HPP_ - -#include - -namespace dds { -namespace sub { -namespace qos { - -typedef detail::DataReaderQos DataReaderQos; - -} //namespace qos -} //namespace sub -} //namespace dds - -#endif //OMG_DDS_QOS_DATA_READER_QOS_HPP_ diff --git a/include/dds/sub/qos/SubscriberQos.hpp b/include/dds/sub/qos/SubscriberQos.hpp deleted file mode 100644 index 350c8998b9e..00000000000 --- a/include/dds/sub/qos/SubscriberQos.hpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_QOS_SUBSCRIBER_QOS_HPP_ -#define OMG_DDS_QOS_SUBSCRIBER_QOS_HPP_ - -#include - -namespace dds { -namespace sub { -namespace qos { - -typedef dds::sub::qos::detail::SubscriberQos SubscriberQos; - -} //namespace qos -} //namespace sub -} //namespace dds - -#endif //OMG_DDS_QOS_SUBSCRIBER_QOS_HPP_ diff --git a/include/dds/sub/qos/detail/DataReaderQos.hpp b/include/dds/sub/qos/detail/DataReaderQos.hpp deleted file mode 100644 index e89b554ef86..00000000000 --- a/include/dds/sub/qos/detail/DataReaderQos.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_PUB_QOS_DETAIL_DATAREADER_QOS_HPP_ -#define EPROSIMA_DDS_PUB_QOS_DETAIL_DATAREADER_QOS_HPP_ - -#include - -namespace dds { -namespace sub { -namespace qos { -namespace detail { - -using DataReaderQos = eprosima::fastdds::dds::DataReaderQos; - -} //namespace detail -} //namespace qos -} //namespace sub -} //namespace dds - -#endif //EPROSIMA_DDS_PUB_QOS_DETAIL_DATAREADER_QOS_HPP_ diff --git a/include/dds/sub/qos/detail/SubscriberQos.hpp b/include/dds/sub/qos/detail/SubscriberQos.hpp deleted file mode 100644 index dd679721242..00000000000 --- a/include/dds/sub/qos/detail/SubscriberQos.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_SUB_QOS_DETAIL_SUBSCRIBER_QOS_HPP_ -#define EPROSIMA_DDS_SUB_QOS_DETAIL_SUBSCRIBER_QOS_HPP_ - -#include - -namespace dds { -namespace sub { -namespace qos { -namespace detail { - -using SubscriberQos = eprosima::fastdds::dds::SubscriberQos; - -} //namespace detail -} //namespace qos -} //namespace sub -} //namespace detail - -#endif //EPROSIMA_DDS_SUB_QOS_DETAIL_SUBSCRIBER_QOS_HPP_ diff --git a/include/dds/topic/Topic.hpp b/include/dds/topic/Topic.hpp deleted file mode 100644 index 068ef0643d9..00000000000 --- a/include/dds/topic/Topic.hpp +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2020 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file Topic.hpp - */ - -#ifndef OMG_DDS_TOPIC_HPP_ -#define OMG_DDS_TOPIC_HPP_ - - -#include -#include -#include -#include - -namespace dds { -namespace topic { - -class TopicListener; - - -class Topic : public dds::core::TEntity -{ - friend class DomainParticipantImpl; - -public: - - OMG_DDS_REF_TYPE_PROTECTED_DC( - Topic, - dds::core::TEntity, - detail::Topic) - - OMG_DDS_IMPLICIT_REF_BASE( - Topic) - - /** - * Create a new Topic. - * - * The Topic will be created with the QoS values specified on the last - * successful call to @link dds::domain::DomainParticipant::default_topic_qos(const ::dds::pub::qos::TopicQos& qos) - * dp.default_topic_qos(qos) @endlink or, if the call was never made, the - * @ref anchor_dds_pub_topic_qos_defaults "default" values. - * - * @param dp the domain participant - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - */ - OMG_DDS_API Topic( - const dds::domain::DomainParticipant& dp, - const std::string& topic_name, - const std::string& type_name); - - /** - * Create a new Topic. - * - * The Topic will be created with the given QosPolicy settings and if - * applicable, attaches the optionally specified TopicListener to it. - * - * See @ref DCPS_Modules_Infrastructure_Listener "listener" for more information - * about listeners and possible status propagation to other entities. - * - * @param dp the domain participant to create the Topic with. - * @param qos a collection of QosPolicy settings for the new Topic. In case - * these settings are not self consistent, no Topic is created. - * @param listener the Topic listener - * @param mask the mask of events notified to the listener - * @throws dds::core::Error - * An internal error has occurred. - * @throws dds::core::OutOfResourcesError - * The Data Distribution Service ran out of resources to - * complete this operation. - * @throws dds::core::InconsistentPolicyError - * The parameter qos contains conflicting QosPolicy settings. - */ - OMG_DDS_API Topic( - const dds::domain::DomainParticipant& dp, - const std::string& topic_name, - const std::string& type_name, - const qos::TopicQos& qos, - TopicListener* listener = nullptr, - const dds::core::status::StatusMask& mask = dds::core::status::StatusMask::none()); - - /** @cond */ - virtual OMG_DDS_API ~Topic(); - /** @endcond */ - -private: - - dds::domain::DomainParticipant* participant_; - -}; - -} /* namespace topic */ -} /* namespace dds */ - -#endif /* OMG_DDS_TOPIC_HPP_ */ diff --git a/include/dds/topic/TopicListener.hpp b/include/dds/topic/TopicListener.hpp deleted file mode 100644 index e0a5d9ca663..00000000000 --- a/include/dds/topic/TopicListener.hpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_SUB_TOPIC_LISTENER_HPP_ -#define OMG_DDS_SUB_TOPIC_LISTENER_HPP_ - -// TODO Remove when PSM DDS Listeners are ready to be used. -#include - -// TODO uncomment when PSM DDS Listeners are ready to be used. -//#include - -namespace dds { -namespace topic { - -/** - * @brief - * Topic events Listener - * - * Since a Topic is an Entity, it has the ability to have a Listener - * associated with it. In this case, the associated Listener should be of type - * TopicListener. This interface must be implemented by the - * application. A user-defined class must be provided by the application which must - * extend from the TopicListener class. - * - * - * All operations for this interface must be implemented in the user-defined class, it is - * up to the application whether an operation is empty or contains some functionality. - * - * - * The TopicListener provides a generic mechanism (actually a - * callback function) for the Data Distribution Service to notify the application of - * relevant asynchronous status change events, such as a missed deadline, violation of - * a QosPolicy setting, etc. The TopicListener is related to - * changes in communication status StatusConditions. - * - * @see @ref DCPS_Modules_Topic "Topic" - * @see @ref DCPS_Modules_Infrastructure_Listener "Listener information" - */ -// TODO Uncomment when PSM listeners are implemented. -//class OMG_DDS_API TopicListener : public virtual AnyDataReaderListener -// TODO Remove the PSM listeners are implemented. -class TopicListener : public eprosima::fastdds::dds::TopicListener -{ -public: - - /** @cond */ - virtual ~TopicListener() - { - } - - /** @endcond */ -}; - -/** - * @brief - * Topic events Listener - * - * This listener is just like TopicListener, except - * that the application doesn't have to implement all operations. - * - * @code{.cpp} - * class ExampleListener : public virtual dds::pub::NoOpTopicListener - * { - * // Not necessary to implement any Listener operations. - * }; - * @endcode - * - * @see dds::pub::TopicListener - */ - -// TODO Uncomment when PSM DDS listeners are ready to be used -/* - class OMG_DDS_API NoOpTopicListener : - public virtual TopicListener, - public virtual NoOpAnyDataReaderListener - */ -// TODO Remove the PSM listeners are implemented. -class NoOpTopicListener : public virtual TopicListener -{ -public: - - /** @cond */ - virtual ~NoOpTopicListener() - { - } - - /** @endcond */ -}; - -} //namespace topic -} //namespace dds - -#endif //OMG_DDS_SUB_TOPIC_LISTENER_HPP_ diff --git a/include/dds/topic/detail/Topic.hpp b/include/dds/topic/detail/Topic.hpp deleted file mode 100644 index a2a606d1a3e..00000000000 --- a/include/dds/topic/detail/Topic.hpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_TOPIC_DETAIL_TOPIC_HPP_ -#define EPROSIMA_DDS_TOPIC_DETAIL_TOPIC_HPP_ - -#include - -/** - * @cond - * Ignore this file in the API - */ - -namespace dds { -namespace topic { -namespace detail { - -using Topic = eprosima::fastdds::dds::Topic; - -} //namespace detail -} //namespace topic -} //namespace dds - -/** @endcond */ - -#endif //EPROSIMA_DDS_TOPIC_DETAIL_TOPIC_HPP_ diff --git a/include/dds/topic/qos/TopicQos.hpp b/include/dds/topic/qos/TopicQos.hpp deleted file mode 100644 index d105d470709..00000000000 --- a/include/dds/topic/qos/TopicQos.hpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2010, Object Management Group, Inc. - * Copyright 2010, PrismTech, Corp. - * Copyright 2010, Real-Time Innovations, Inc. - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OMG_DDS_TOPIC_QOS_TOPIC_QOS_HPP_ -#define OMG_DDS_TOPIC_QOS_TOPIC_QOS_HPP_ - -#include - -namespace dds { -namespace topic { -namespace qos { - -typedef dds::topic::qos::detail::TopicQos TopicQos; - -} //namespace qos -} //namespace topic -} //namespace dds - - -#endif //OMG_DDS_TOPIC_QOS_TOPIC_QOS_HPP_ diff --git a/include/dds/topic/qos/detail/TopicQos.hpp b/include/dds/topic/qos/detail/TopicQos.hpp deleted file mode 100644 index 120c37714dd..00000000000 --- a/include/dds/topic/qos/detail/TopicQos.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef EPROSIMA_DDS_TOPIC_QOS_DETAIL_TOPIC_QOS_HPP_ -#define EPROSIMA_DDS_TOPIC_QOS_DETAIL_TOPIC_QOS_HPP_ - -#include - -namespace dds { -namespace topic { -namespace qos { -namespace detail { - -using TopicQos = eprosima::fastdds::dds::TopicQos; - -} //namespace detail -} //namespace qos -} //namespace topic -} //namespace dds - -#endif //EPROSIMA_DDS_TOPIC_QOS_DETAIL_TOPIC_QOS_HPP_ diff --git a/include/fastrtps/config.h.in b/include/fastdds/config.h.in similarity index 78% rename from include/fastrtps/config.h.in rename to include/fastdds/config.h.in index 9c380a933f9..7e28350c157 100644 --- a/include/fastrtps/config.h.in +++ b/include/fastdds/config.h.in @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef _FASTRTPS_CONFIG_H_ -#define _FASTRTPS_CONFIG_H_ +#ifndef _FASTDDS_CONFIG_H_ +#define _FASTDDS_CONFIG_H_ -#define FASTRTPS_VERSION_MAJOR @PROJECT_VERSION_MAJOR@ -#define FASTRTPS_VERSION_MINOR @PROJECT_VERSION_MINOR@ -#define FASTRTPS_VERSION_MICRO @PROJECT_VERSION_PATCH@ -#define FASTRTPS_VERSION_STR "@PROJECT_VERSION@" +#define FASTDDS_VERSION_MAJOR @PROJECT_VERSION_MAJOR@ +#define FASTDDS_VERSION_MINOR @PROJECT_VERSION_MINOR@ +#define FASTDDS_VERSION_MICRO @PROJECT_VERSION_PATCH@ +#define FASTDDS_VERSION_STR "@PROJECT_VERSION@" #define GEN_API_VER 2 @@ -105,23 +105,23 @@ // Deprecated macro #if __cplusplus >= 201402L -#define FASTRTPS_DEPRECATED(msg) [[ deprecated(msg) ]] +#define FASTDDS_DEPRECATED(msg) [[ deprecated(msg) ]] #elif defined(__GNUC__) || defined(__clang__) -#define FASTRTPS_DEPRECATED(msg) __attribute__ ((deprecated(msg))) +#define FASTDDS_DEPRECATED(msg) __attribute__ ((deprecated(msg))) #elif defined(_MSC_VER) -#define FASTRTPS_DEPRECATED(msg) __declspec(deprecated(msg)) +#define FASTDDS_DEPRECATED(msg) __declspec(deprecated(msg)) #else -#define FASTRTPS_DEPRECATED(msg) +#define FASTDDS_DEPRECATED(msg) #endif /* if __cplusplus >= 201402L */ // Deprecation with version #define FASTDDS_DEPRECATED_UNTIL(major, entity_name, msg) \ - static_assert(FASTRTPS_VERSION_MAJOR < major, #entity_name " reached deprecation version " #major); \ - FASTRTPS_DEPRECATED(#entity_name " has been deprecated and will be removed on major version " #major ". " msg) + static_assert(FASTDDS_VERSION_MAJOR < major, #entity_name " reached deprecation version " #major); \ + FASTDDS_DEPRECATED(#entity_name " has been deprecated and will be removed on major version " #major ". " msg) #define FASTDDS_TODO_BEFORE(major, minor, msg) \ - static_assert((FASTRTPS_VERSION_MAJOR < major) || \ - (FASTRTPS_VERSION_MAJOR == major && FASTRTPS_VERSION_MINOR < minor), \ + static_assert((FASTDDS_VERSION_MAJOR < major) || \ + (FASTDDS_VERSION_MAJOR == major && FASTDDS_VERSION_MINOR < minor), \ "TODO before version " #major "." #minor " : " #msg) #if FASTCDR_VERSION_MAJOR > 1 @@ -130,4 +130,4 @@ #define FASTDDS_SER_METHOD_DEPRECATED(major, entity_name, msg) #endif -#endif // _FASTRTPS_CONFIG_H_ +#endif // _FASTDDS_CONFIG_H_ diff --git a/include/fastdds/dds/builtin/common/ReplyHeader.hpp b/include/fastdds/dds/builtin/common/ReplyHeader.hpp index f643a5789eb..d04b29a6abc 100644 --- a/include/fastdds/dds/builtin/common/ReplyHeader.hpp +++ b/include/fastdds/dds/builtin/common/ReplyHeader.hpp @@ -20,8 +20,8 @@ #ifndef REPLYHEADER_HPP #define REPLYHEADER_HPP -#include #include +#include namespace eprosima { @@ -39,24 +39,6 @@ struct ReplyHeader RemoteExceptionCode_t remoteEx; -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastdds::dds::rpc::ReplyHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const ReplyHeader& data, - size_t current_alignment = 0); - - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastdds::dds::rpc::ReplyHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastdds::dds::rpc::ReplyHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI static bool isKeyDefined() { return false; diff --git a/include/fastdds/dds/builtin/common/RequestHeader.hpp b/include/fastdds/dds/builtin/common/RequestHeader.hpp index bf7edd4fb8f..6a140ce5e85 100644 --- a/include/fastdds/dds/builtin/common/RequestHeader.hpp +++ b/include/fastdds/dds/builtin/common/RequestHeader.hpp @@ -20,8 +20,8 @@ #ifndef REQUESTHEADER_HPP #define REQUESTHEADER_HPP -#include #include +#include namespace eprosima { @@ -39,24 +39,6 @@ struct RequestHeader InstanceName instanceName; -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastdds::dds::rpc::RequestHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const RequestHeader& data, - size_t current_alignment = 0); - - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastdds::dds::rpc::RequestHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastdds::dds::rpc::RequestHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI static bool isKeyDefined() { return false; diff --git a/include/fastdds/dds/builtin/typelookup/TypeLookupReplyListener.hpp b/include/fastdds/dds/builtin/typelookup/TypeLookupReplyListener.hpp index adc4b6c6499..d06807a9a36 100644 --- a/include/fastdds/dds/builtin/typelookup/TypeLookupReplyListener.hpp +++ b/include/fastdds/dds/builtin/typelookup/TypeLookupReplyListener.hpp @@ -20,9 +20,9 @@ #ifndef TYPELOOKUP_REPLY_LISTENER_HPP_ #define TYPELOOKUP_REPLY_LISTENER_HPP_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#include -#include +#include +#include namespace eprosima { namespace fastrtps { diff --git a/include/fastdds/dds/builtin/typelookup/TypeLookupRequestListener.hpp b/include/fastdds/dds/builtin/typelookup/TypeLookupRequestListener.hpp index 87741fc84c5..a762efa8cc4 100644 --- a/include/fastdds/dds/builtin/typelookup/TypeLookupRequestListener.hpp +++ b/include/fastdds/dds/builtin/typelookup/TypeLookupRequestListener.hpp @@ -20,9 +20,9 @@ #ifndef TYPELOOKUP_REQUEST_LISTENER_HPP_ #define TYPELOOKUP_REQUEST_LISTENER_HPP_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#include -#include +#include +#include namespace eprosima { namespace fastrtps { diff --git a/include/fastdds/dds/core/status/IncompatibleQosStatus.hpp b/include/fastdds/dds/core/status/IncompatibleQosStatus.hpp index c5ee4908d34..d9c1dbd216b 100644 --- a/include/fastdds/dds/core/status/IncompatibleQosStatus.hpp +++ b/include/fastdds/dds/core/status/IncompatibleQosStatus.hpp @@ -16,14 +16,14 @@ * @file IncompatibleQosStatus.hpp */ -#ifndef _FASTRTPS_INCOMPATIBLE_QOS_STATUS_HPP_ -#define _FASTRTPS_INCOMPATIBLE_QOS_STATUS_HPP_ - -#include +#ifndef _FASTDDS_INCOMPATIBLE_QOS_STATUS_HPP_ +#define _FASTDDS_INCOMPATIBLE_QOS_STATUS_HPP_ #include #include +#include + namespace eprosima { namespace fastdds { namespace dds { @@ -93,4 +93,4 @@ using OfferedIncompatibleQosStatus = IncompatibleQosStatus; } //end of namespace fastdds } //end of namespace eprosima -#endif // _FASTRTPS_INCOMPATIBLE_QOS_STATUS_HPP_ +#endif // _FASTDDS_INCOMPATIBLE_QOS_STATUS_HPP_ diff --git a/include/fastdds/dds/domain/DomainParticipant.hpp b/include/fastdds/dds/domain/DomainParticipant.hpp index 7ac5f4b8998..572b850e5ce 100644 --- a/include/fastdds/dds/domain/DomainParticipant.hpp +++ b/include/fastdds/dds/domain/DomainParticipant.hpp @@ -737,7 +737,7 @@ class DomainParticipant : public Entity RTPS_DllAPI ReturnCode_t get_current_time( fastrtps::Time_t& current_time) const; - // DomainParticipant methods specific from Fast-DDS + // DomainParticipant methods specific from Fast DDS /** * Register a type in this participant. diff --git a/include/fastdds/dds/domain/DomainParticipantFactory.hpp b/include/fastdds/dds/domain/DomainParticipantFactory.hpp index 475b36a8a54..df14c4a40c2 100644 --- a/include/fastdds/dds/domain/DomainParticipantFactory.hpp +++ b/include/fastdds/dds/domain/DomainParticipantFactory.hpp @@ -20,16 +20,15 @@ #ifndef _FASTDDS_DOMAINPARTICIPANT_HPP_ #define _FASTDDS_DOMAINPARTICIPANT_HPP_ -#include -#include -#include -#include -#include - #include #include #include +#include +#include +#include +#include + using eprosima::fastrtps::types::ReturnCode_t; namespace eprosima { diff --git a/include/fastdds/dds/domain/DomainParticipantListener.hpp b/include/fastdds/dds/domain/DomainParticipantListener.hpp index 4d6c98c8131..5b0afb78451 100644 --- a/include/fastdds/dds/domain/DomainParticipantListener.hpp +++ b/include/fastdds/dds/domain/DomainParticipantListener.hpp @@ -63,22 +63,6 @@ class DomainParticipantListener : { } - /*! - * This method is called when a new Participant is discovered, or a previously discovered participant changes - * its QOS or is removed. - * - * @param[out] participant Pointer to the Participant which discovered the remote participant. - * @param[out] info Remote participant information. User can take ownership of the object. - */ - FASTDDS_TODO_BEFORE(3, 0, "Remove this overload"); - virtual void on_participant_discovery( - DomainParticipant* participant, - fastrtps::rtps::ParticipantDiscoveryInfo&& info) - { - static_cast(participant); - static_cast(info); - } - /*! * This method is called when a new Participant is discovered, or a previously discovered participant changes * its QOS or is removed. diff --git a/include/fastdds/dds/publisher/DataWriter.hpp b/include/fastdds/dds/publisher/DataWriter.hpp index 239e9ee5851..6ba2f52506b 100644 --- a/include/fastdds/dds/publisher/DataWriter.hpp +++ b/include/fastdds/dds/publisher/DataWriter.hpp @@ -22,17 +22,14 @@ #include #include #include +#include #include #include #include #include - #include #include - #include - -#include #include using eprosima::fastrtps::types::ReturnCode_t; @@ -187,15 +184,6 @@ class DataWriter : public DomainEntity const InstanceHandle_t& handle, const fastrtps::Time_t& timestamp); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastdds::dds:DataWriter::write_w_timestamp()", - "In favor of version using eprosima::fastrtps::Time_t.") - RTPS_DllAPI ReturnCode_t write_w_timestamp( - void* data, - const InstanceHandle_t& handle, - const fastrtps::rtps::Time_t& timestamp); -#endif // DOXYGEN_SHOULD_SKIP_THIS - /*! * @brief Informs that the application will be modifying a particular instance. * It gives an opportunity to the middleware to pre-configure itself to improve performance. @@ -230,14 +218,6 @@ class DataWriter : public DomainEntity void* instance, const fastrtps::Time_t& timestamp); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastdds::dds:DataWriter::register_instance_w_timestamp()", - "In favor of version using eprosima::fastrtps::Time_t.") - RTPS_DllAPI InstanceHandle_t register_instance_w_timestamp( - void* instance, - const fastrtps::rtps::Time_t& timestamp); -#endif // DOXYGEN_SHOULD_SKIP_THIS - /*! * @brief This operation reverses the action of `register_instance`. * It should only be called on an instance that is currently registered. @@ -277,15 +257,6 @@ class DataWriter : public DomainEntity const InstanceHandle_t& handle, const fastrtps::Time_t& timestamp); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastdds::dds:DataWriter::unregister_instance_w_timestamp()", - "In favor of version using eprosima::fastrtps::Time_t.") - RTPS_DllAPI ReturnCode_t unregister_instance_w_timestamp( - void* instance, - const InstanceHandle_t& handle, - const fastrtps::rtps::Time_t& timestamp); -#endif // DOXYGEN_SHOULD_SKIP_THIS - /** * This operation can be used to retrieve the instance key that corresponds to an * @ref eprosima::fastdds::dds::Entity::instance_handle_ "instance_handle". @@ -530,13 +501,6 @@ class DataWriter : public DomainEntity RTPS_DllAPI ReturnCode_t get_matched_subscriptions( std::vector& subscription_handles) const; -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastdds::dds:DataWriter::get_matched_subscriptions()", - "In favor of version using std::vector.") - RTPS_DllAPI ReturnCode_t get_matched_subscriptions( - std::vector& subscription_handles) const; -#endif // DOXYGEN_SHOULD_SKIP_THIS - /** * @brief Clears the DataWriter history * diff --git a/include/fastdds/dds/publisher/DataWriterListener.hpp b/include/fastdds/dds/publisher/DataWriterListener.hpp index db0f6723968..15dc67c60c5 100644 --- a/include/fastdds/dds/publisher/DataWriterListener.hpp +++ b/include/fastdds/dds/publisher/DataWriterListener.hpp @@ -16,8 +16,8 @@ * @file DataWriterListener.hpp */ -#ifndef _FASTRTPS_DATAWRITERLISTENER_HPP_ -#define _FASTRTPS_DATAWRITERLISTENER_HPP_ +#ifndef _FASTDDS_DATAWRITERLISTENER_HPP_ +#define _FASTDDS_DATAWRITERLISTENER_HPP_ #include #include @@ -129,4 +129,4 @@ class RTPS_DllAPI DataWriterListener } /* namespace fastdds */ } /* namespace eprosima */ -#endif /* _FASTRTPS_DATAWRITERLISTENER_HPP_ */ +#endif /* _FASTDDS_DATAWRITERLISTENER_HPP_ */ diff --git a/include/fastdds/dds/publisher/PublisherListener.hpp b/include/fastdds/dds/publisher/PublisherListener.hpp index 1045c544a2c..31c820b91f7 100644 --- a/include/fastdds/dds/publisher/PublisherListener.hpp +++ b/include/fastdds/dds/publisher/PublisherListener.hpp @@ -19,8 +19,8 @@ #ifndef _FASTDDS_PUBLISHERLISTENER_HPP_ #define _FASTDDS_PUBLISHERLISTENER_HPP_ -#include #include +#include #include #include diff --git a/include/fastdds/dds/publisher/qos/PublisherQos.hpp b/include/fastdds/dds/publisher/qos/PublisherQos.hpp index 52151c4cbdc..99adc03e83f 100644 --- a/include/fastdds/dds/publisher/qos/PublisherQos.hpp +++ b/include/fastdds/dds/publisher/qos/PublisherQos.hpp @@ -21,7 +21,6 @@ #define _FASTDDS_PUBLISHERQOS_HPP_ #include -#include namespace eprosima { namespace fastdds { diff --git a/include/fastdds/dds/publisher/qos/WriterQos.hpp b/include/fastdds/dds/publisher/qos/WriterQos.hpp index 9178fda89b0..d8ec2be70a2 100644 --- a/include/fastdds/dds/publisher/qos/WriterQos.hpp +++ b/include/fastdds/dds/publisher/qos/WriterQos.hpp @@ -31,7 +31,7 @@ namespace dds { * Although these values can be set and are transmitted * during the Endpoint Discovery Protocol, not all of the behaviour associated with them has been implemented in the library. * Please consult each of them to check for implementation details and default values. - * @ingroup FASTRTPS_ATTRIBUTES_MODULE + * @ingroup FASTDDS_QOS_MODULE */ class WriterQos { diff --git a/include/fastdds/dds/subscriber/DataReaderListener.hpp b/include/fastdds/dds/subscriber/DataReaderListener.hpp index 0c6dbcbe903..b0c8f0c45ed 100644 --- a/include/fastdds/dds/subscriber/DataReaderListener.hpp +++ b/include/fastdds/dds/subscriber/DataReaderListener.hpp @@ -16,16 +16,16 @@ * @file DataReaderListener.hpp */ -#ifndef _FASTRTPS_DATAREADERLISTENER_HPP_ -#define _FASTRTPS_DATAREADERLISTENER_HPP_ +#ifndef _FASTDDS_DATAREADERLISTENER_HPP_ +#define _FASTDDS_DATAREADERLISTENER_HPP_ -#include -#include -#include -#include -#include #include +#include +#include +#include +#include #include +#include namespace eprosima { namespace fastdds { @@ -88,7 +88,7 @@ class DataReaderListener */ RTPS_DllAPI virtual void on_requested_deadline_missed( DataReader* reader, - const fastrtps::RequestedDeadlineMissedStatus& status) + const RequestedDeadlineMissedStatus& status) { (void)reader; (void)status; @@ -102,7 +102,7 @@ class DataReaderListener */ RTPS_DllAPI virtual void on_liveliness_changed( DataReader* reader, - const fastrtps::LivelinessChangedStatus& status) + const LivelinessChangedStatus& status) { (void)reader; (void)status; @@ -116,7 +116,7 @@ class DataReaderListener */ RTPS_DllAPI virtual void on_sample_rejected( DataReader* reader, - const fastrtps::SampleRejectedStatus& status) + const SampleRejectedStatus& status) { (void)reader; (void)status; @@ -156,4 +156,4 @@ class DataReaderListener } /* namespace fastdds */ } /* namespace eprosima */ -#endif /* _FASTRTPS_DATAREADERLISTENER_HPP_ */ +#endif /* _FASTDDS_DATAREADERLISTENER_HPP_ */ diff --git a/include/fastdds/dds/subscriber/SampleInfo.hpp b/include/fastdds/dds/subscriber/SampleInfo.hpp index 4c1f2354495..ccc173fc78c 100644 --- a/include/fastdds/dds/subscriber/SampleInfo.hpp +++ b/include/fastdds/dds/subscriber/SampleInfo.hpp @@ -34,34 +34,6 @@ namespace eprosima { namespace fastdds { namespace dds { -FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastdds::dds::READ", - "Use eprosima::fastdds::dds::READ_SAMPLE_STATE instead.") -constexpr SampleStateKind READ = READ_SAMPLE_STATE; - -FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastdds::dds::NOT_READ", - "Use eprosima::fastdds::dds::NOT_READ_SAMPLE_STATE instead.") -constexpr SampleStateKind NOT_READ = NOT_READ_SAMPLE_STATE; - -FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastdds::dds::NEW", - "Use eprosima::fastdds::dds::NEW_VIEW_STATE instead.") -constexpr ViewStateKind NEW = NEW_VIEW_STATE; - -FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastdds::dds::NOT_NEW", - "Use eprosima::fastdds::dds::NOT_NEW_VIEW_STATE instead.") -constexpr ViewStateKind NOT_NEW = NOT_NEW_VIEW_STATE; - -FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastdds::dds::ALIVE", - "Use eprosima::fastdds::dds::ALIVE_INSTANCE_STATE instead.") -constexpr InstanceStateKind ALIVE = ALIVE_INSTANCE_STATE; - -FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastdds::dds::NOT_ALIVE_DISPOSED", - "Use eprosima::fastdds::dds::NOT_ALIVE_DISPOSED_INSTANCE_STATE instead.") -constexpr InstanceStateKind NOT_ALIVE_DISPOSED = NOT_ALIVE_DISPOSED_INSTANCE_STATE; - -FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastdds::dds::NOT_ALIVE_NO_WRITERS", - "Use eprosima::fastdds::dds::NOT_ALIVE_NO_WRITERS_INSTANCE_STATE instead.") -constexpr InstanceStateKind NOT_ALIVE_NO_WRITERS = NOT_ALIVE_NO_WRITERS_INSTANCE_STATE; - /*! * @brief SampleInfo is the information that accompanies each sample that is ‘read’ or ‘taken.’ */ diff --git a/include/fastdds/dds/subscriber/SubscriberListener.hpp b/include/fastdds/dds/subscriber/SubscriberListener.hpp index 080921f06a5..25f2b411e37 100644 --- a/include/fastdds/dds/subscriber/SubscriberListener.hpp +++ b/include/fastdds/dds/subscriber/SubscriberListener.hpp @@ -19,11 +19,11 @@ #ifndef _FASTDDS_SUBLISTENER_HPP_ #define _FASTDDS_SUBLISTENER_HPP_ -#include -#include -#include +#include +#include #include #include +#include namespace eprosima { namespace fastdds { diff --git a/include/fastdds/dds/subscriber/qos/ReaderQos.hpp b/include/fastdds/dds/subscriber/qos/ReaderQos.hpp index 84b3e8154d2..44e20180225 100644 --- a/include/fastdds/dds/subscriber/qos/ReaderQos.hpp +++ b/include/fastdds/dds/subscriber/qos/ReaderQos.hpp @@ -31,7 +31,7 @@ namespace dds { * Although these values can be set and are transmitted * during the Endpoint Discovery Protocol, not all of the behaviour associated with them has been implemented in the library. * Please consult each of them to check for implementation details and default values. - * @ingroup FASTRTPS_ATTRIBUTES_MODULE + * @ingroup FASTDDS_QOS_MODULE */ class ReaderQos { diff --git a/include/fastdds/dds/subscriber/qos/SubscriberQos.hpp b/include/fastdds/dds/subscriber/qos/SubscriberQos.hpp index 3f1e029d65c..7aa16a2b1e1 100644 --- a/include/fastdds/dds/subscriber/qos/SubscriberQos.hpp +++ b/include/fastdds/dds/subscriber/qos/SubscriberQos.hpp @@ -21,7 +21,6 @@ #define _FASTDDS_SUBSCRIBERQOS_HPP_ #include -#include namespace eprosima { namespace fastdds { diff --git a/include/fastdds/dds/topic/TopicDataType.hpp b/include/fastdds/dds/topic/TopicDataType.hpp index 3bd5072444a..e06f450bdf2 100644 --- a/include/fastdds/dds/topic/TopicDataType.hpp +++ b/include/fastdds/dds/topic/TopicDataType.hpp @@ -57,7 +57,7 @@ class TypeSupport; /** * Class TopicDataType used to provide the DomainRTPSParticipant with the methods to serialize, deserialize and get the key of a specific data type. * The user should created a class that inherits from this one, where Serialize and deserialize methods MUST be implemented. - * @ingroup FASTRTPS_MODULE, FASTDDS_MODULE + * @ingroup FASTDDS_MODULE */ class TopicDataType { @@ -81,6 +81,7 @@ class TopicDataType * @param[out] payload Pointer to the payload * @return True if correct. */ + // TODO(jlbueno) Remove when Fast DDS-Gen is updated // FASTDDS_TODO_BEFORE(3, 0, "Remove this overload") RTPS_DllAPI virtual bool serialize( void* data, diff --git a/include/fastdds/rtps/attributes/EndpointAttributes.h b/include/fastdds/rtps/attributes/EndpointAttributes.h index 7317b4b4379..09ff7d02ee2 100644 --- a/include/fastdds/rtps/attributes/EndpointAttributes.h +++ b/include/fastdds/rtps/attributes/EndpointAttributes.h @@ -19,12 +19,11 @@ #ifndef _FASTDDS_ENDPOINTATTRIBUTES_H_ #define _FASTDDS_ENDPOINTATTRIBUTES_H_ +#include #include #include -#include - #include -#include +#include #include #if HAVE_SECURITY @@ -77,7 +76,7 @@ class EndpointAttributes PropertyPolicy properties; //!Ownership - OwnershipQosPolicyKind ownershipKind = SHARED_OWNERSHIP_QOS; + fastdds::dds::OwnershipQosPolicyKind ownershipKind = fastdds::dds::OwnershipQosPolicyKind::SHARED_OWNERSHIP_QOS; EndpointAttributes() { @@ -129,7 +128,7 @@ class EndpointAttributes * @param cfg Configuration to be set */ inline void set_data_sharing_configuration( - DataSharingQosPolicy cfg) + fastdds::dds::DataSharingQosPolicy cfg) { datasharing_ = cfg; } @@ -138,7 +137,7 @@ class EndpointAttributes * Get the DataSharing configuration * @return Configuration of data sharing */ - inline const DataSharingQosPolicy& data_sharing_configuration() const + inline const fastdds::dds::DataSharingQosPolicy& data_sharing_configuration() const { return datasharing_; } @@ -170,7 +169,7 @@ class EndpointAttributes #endif // HAVE_SECURITY //! Settings for datasharing - DataSharingQosPolicy datasharing_; + fastdds::dds::DataSharingQosPolicy datasharing_; }; } /* namespace rtps */ diff --git a/include/fastdds/rtps/attributes/RTPSParticipantAttributes.h b/include/fastdds/rtps/attributes/RTPSParticipantAttributes.h index 9a826b3933c..78486f7b1a8 100644 --- a/include/fastdds/rtps/attributes/RTPSParticipantAttributes.h +++ b/include/fastdds/rtps/attributes/RTPSParticipantAttributes.h @@ -301,28 +301,6 @@ class DiscoverySettings (this->ignoreParticipantFlags == b.ignoreParticipantFlags); } - /** - * Get the static endpoint XML filename - * @return Static endpoint XML filename - */ - FASTRTPS_DEPRECATED("Use static_edp_xml_config()") - const char* getStaticEndpointXMLFilename() const - { - return static_edp_xml_config(); - } - - /** - * Set the static endpoint XML filename - * @param str Static endpoint XML filename - * @deprecated - */ - FASTRTPS_DEPRECATED("Use static_edp_xml_config()") - void setStaticEndpointXMLFilename( - const char* str) - { - static_edp_xml_config_ = "file://" + std::string(str); - } - /** * Set the static endpoint XML configuration. * @param str URI specifying the static endpoint XML configuration. diff --git a/include/fastdds/rtps/attributes/ReaderAttributes.h b/include/fastdds/rtps/attributes/ReaderAttributes.h index 890623425eb..cd4f2403831 100644 --- a/include/fastdds/rtps/attributes/ReaderAttributes.h +++ b/include/fastdds/rtps/attributes/ReaderAttributes.h @@ -20,10 +20,10 @@ #ifndef _FASTDDS_RTPS_ATTRIBUTES_READERATTRIBUTES_H_ #define _FASTDDS_RTPS_ATTRIBUTES_READERATTRIBUTES_H_ +#include #include #include #include -#include #include namespace eprosima { @@ -70,7 +70,7 @@ class ReaderAttributes public: ReaderAttributes() - : liveliness_kind_(AUTOMATIC_LIVELINESS_QOS) + : liveliness_kind_(fastdds::dds::LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS) , liveliness_lease_duration(TIME_T_INFINITE_SECONDS, TIME_T_INFINITE_NANOSECONDS) , expectsInlineQos(false) , disable_positive_acks(false) @@ -91,7 +91,7 @@ class ReaderAttributes ReaderTimes times; //! Liveliness kind - LivelinessQosPolicyKind liveliness_kind_; + fastdds::dds::LivelinessQosPolicyKind liveliness_kind_; //! Liveliness lease duration Duration_t liveliness_lease_duration; diff --git a/include/fastdds/rtps/attributes/ServerAttributes.h b/include/fastdds/rtps/attributes/ServerAttributes.h index 13f58753c43..0d006a3d125 100644 --- a/include/fastdds/rtps/attributes/ServerAttributes.h +++ b/include/fastdds/rtps/attributes/ServerAttributes.h @@ -22,7 +22,7 @@ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC #include -#include +#include #include #include @@ -69,22 +69,6 @@ class RemoteServerAttributes RTPS_DllAPI fastrtps::rtps::GUID_t GetPDPReader() const; RTPS_DllAPI fastrtps::rtps::GUID_t GetPDPWriter() const; -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastrtps::rtps:GetEDPPublicationsReader()", - "Not implemented nor used functions.") - RTPS_DllAPI fastrtps::rtps::GUID_t GetEDPPublicationsReader() const; - FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastrtps::rtps:GetEDPSubscriptionsWriter()", - "Not implemented nor used functions.") - RTPS_DllAPI fastrtps::rtps::GUID_t GetEDPSubscriptionsWriter() const; - - FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastrtps::rtps:GetEDPPublicationsWriter()", - "Not implemented nor used functions.") - RTPS_DllAPI fastrtps::rtps::GUID_t GetEDPPublicationsWriter() const; - FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastrtps::rtps:GetEDPSubscriptionsReader()", - "Not implemented nor used functions.") - RTPS_DllAPI fastrtps::rtps::GUID_t GetEDPSubscriptionsReader() const; -#endif // ifndef DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI inline bool ReadguidPrefix( const char* pfx) { diff --git a/include/fastdds/rtps/attributes/WriterAttributes.h b/include/fastdds/rtps/attributes/WriterAttributes.h index 7c9dd2d5ac1..911f7c641cb 100644 --- a/include/fastdds/rtps/attributes/WriterAttributes.h +++ b/include/fastdds/rtps/attributes/WriterAttributes.h @@ -19,15 +19,15 @@ #ifndef _FASTDDS_WRITERATTRIBUTES_H_ #define _FASTDDS_WRITERATTRIBUTES_H_ -#include -#include -#include +#include + +#include #include +#include +#include #include +#include #include -#include - -#include namespace eprosima { namespace fastrtps { @@ -88,7 +88,7 @@ class WriterAttributes public: WriterAttributes() - : liveliness_kind(AUTOMATIC_LIVELINESS_QOS) + : liveliness_kind(fastdds::dds::LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS) , liveliness_lease_duration(TIME_T_INFINITE_SECONDS, TIME_T_INFINITE_NANOSECONDS) , liveliness_announcement_period(TIME_T_INFINITE_SECONDS, TIME_T_INFINITE_NANOSECONDS) , mode(SYNCHRONOUS_WRITER) @@ -112,7 +112,7 @@ class WriterAttributes WriterTimes times; //! Liveliness kind - fastrtps::LivelinessQosPolicyKind liveliness_kind; + fastdds::dds::LivelinessQosPolicyKind liveliness_kind; //! Liveliness lease duration Duration_t liveliness_lease_duration; diff --git a/include/fastdds/rtps/builtin/data/ParticipantProxyData.h b/include/fastdds/rtps/builtin/data/ParticipantProxyData.h index 101d0249c9b..77eed9eb004 100644 --- a/include/fastdds/rtps/builtin/data/ParticipantProxyData.h +++ b/include/fastdds/rtps/builtin/data/ParticipantProxyData.h @@ -21,6 +21,10 @@ #define _FASTDDS_RTPS_BUILTIN_DATA_PARTICIPANTPROXYDATA_H_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC + +#include + +#include #include #include #include @@ -31,10 +35,6 @@ #if HAVE_SECURITY #include #endif // if HAVE_SECURITY -#include - - -#include #define BUILTIN_PARTICIPANT_DATA_MAX_SIZE 100 #define TYPELOOKUP_DATA_MAX_SIZE 5000 @@ -108,9 +108,9 @@ class ParticipantProxyData //! bool isAlive; //! - ParameterPropertyList_t m_properties; + fastdds::dds::ParameterPropertyList_t m_properties; //! - UserDataQosPolicy m_userData; + fastdds::dds::UserDataQosPolicy m_userData; //! TimedEvent* lease_duration_event; //! diff --git a/include/fastdds/rtps/builtin/data/ReaderProxyData.h b/include/fastdds/rtps/builtin/data/ReaderProxyData.h index ba3fa8e0013..7ad052fe4ea 100644 --- a/include/fastdds/rtps/builtin/data/ReaderProxyData.h +++ b/include/fastdds/rtps/builtin/data/ReaderProxyData.h @@ -21,6 +21,7 @@ #define _FASTDDS_RTPS_BUILTIN_DATA_READERPROXYDATA_H_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC +#include #include #include #include @@ -30,9 +31,6 @@ #include #endif // if HAVE_SECURITY #include -#include - - namespace eprosima { namespace fastrtps { @@ -444,7 +442,7 @@ class ReaderProxyData //! bool m_expectsInlineQos; //!Reader Qos - ReaderQos m_qos; + fastdds::dds::ReaderQos m_qos; #if HAVE_SECURITY //!EndpointSecurityInfo.endpoint_security_attributes diff --git a/include/fastdds/rtps/builtin/data/WriterProxyData.h b/include/fastdds/rtps/builtin/data/WriterProxyData.h index 14ffcb079ed..6df26d44b8a 100644 --- a/include/fastdds/rtps/builtin/data/WriterProxyData.h +++ b/include/fastdds/rtps/builtin/data/WriterProxyData.h @@ -21,14 +21,15 @@ #define _FASTDDS_RTPS_BUILTIN_DATA_WRITERPROXYDATA_H_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC +#include #include +#include #include #include #if HAVE_SECURITY #include #endif // if HAVE_SECURITY #include -#include #include namespace eprosima { @@ -385,7 +386,7 @@ class WriterProxyData } //!WriterQOS - WriterQos m_qos; + fastdds::dds::WriterQos m_qos; /** * Set participant client server sample identity diff --git a/include/fastdds/rtps/builtin/discovery/endpoint/EDP.h b/include/fastdds/rtps/builtin/discovery/endpoint/EDP.h index bcdc927919a..3da06fcd527 100644 --- a/include/fastdds/rtps/builtin/discovery/endpoint/EDP.h +++ b/include/fastdds/rtps/builtin/discovery/endpoint/EDP.h @@ -171,7 +171,7 @@ class EDP bool newLocalReaderProxyData( RTPSReader* R, const TopicAttributes& att, - const ReaderQos& qos, + const fastdds::dds::ReaderQos& qos, const fastdds::rtps::ContentFilterProperty* content_filter = nullptr); /** * Create a new ReaderPD for a local Writer. @@ -183,7 +183,7 @@ class EDP bool newLocalWriterProxyData( RTPSWriter* W, const TopicAttributes& att, - const WriterQos& qos); + const fastdds::dds::WriterQos& qos); /** * A previously created Reader has been updated * @param R Pointer to the reader @@ -195,7 +195,7 @@ class EDP bool updatedLocalReader( RTPSReader* R, const TopicAttributes& att, - const ReaderQos& qos, + const fastdds::dds::ReaderQos& qos, const fastdds::rtps::ContentFilterProperty* content_filter = nullptr); /** * A previously created Writer has been updated @@ -207,7 +207,7 @@ class EDP bool updatedLocalWriter( RTPSWriter* W, const TopicAttributes& att, - const WriterQos& qos); + const fastdds::dds::WriterQos& qos); /** * Check the validity of a matching between a local RTPSWriter and a ReaderProxyData object. diff --git a/include/fastdds/rtps/builtin/discovery/participant/PDP.h b/include/fastdds/rtps/builtin/discovery/participant/PDP.h index a94d40a4e37..273a46191ed 100644 --- a/include/fastdds/rtps/builtin/discovery/participant/PDP.h +++ b/include/fastdds/rtps/builtin/discovery/participant/PDP.h @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -34,7 +35,6 @@ #include #include #include -#include #include #include diff --git a/include/fastdds/rtps/builtin/liveliness/WLP.h b/include/fastdds/rtps/builtin/liveliness/WLP.h index a143bec57ba..0b014ef14e8 100644 --- a/include/fastdds/rtps/builtin/liveliness/WLP.h +++ b/include/fastdds/rtps/builtin/liveliness/WLP.h @@ -21,16 +21,15 @@ #define _FASTDDS_RTPS_WLP_H_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#include #include +#include -#include -#include -#include -#include - -#include +#include #include +#include +#include +#include +#include namespace eprosima { namespace fastrtps { @@ -101,7 +100,7 @@ class WLP */ bool add_local_writer( RTPSWriter* W, - const WriterQos& wqos); + const fastdds::dds::WriterQos& wqos); /** * Remove a local writer from the liveliness protocol. * @param W Pointer to the RTPSWriter. @@ -118,7 +117,7 @@ class WLP */ bool add_local_reader( RTPSReader* reader, - const ReaderQos& rqos); + const fastdds::dds::ReaderQos& rqos); /** * @brief Removes a local reader from the livliness protocol diff --git a/include/fastdds/rtps/builtin/liveliness/WLPListener.h b/include/fastdds/rtps/builtin/liveliness/WLPListener.h index 825fe431933..b21e1170316 100644 --- a/include/fastdds/rtps/builtin/liveliness/WLPListener.h +++ b/include/fastdds/rtps/builtin/liveliness/WLPListener.h @@ -21,11 +21,11 @@ #define _FASTDDS_RTPS_WLPLISTENER_H_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC +#include #include #include #include #include -#include namespace eprosima { namespace fastrtps { diff --git a/include/fastdds/rtps/common/Locator.h b/include/fastdds/rtps/common/Locator.h index 3b670d5e797..2251a41b2a4 100644 --- a/include/fastdds/rtps/common/Locator.h +++ b/include/fastdds/rtps/common/Locator.h @@ -523,19 +523,4 @@ using Locator = eprosima::fastrtps::rtps::Locator_t; } // namespace fastdds } // namespace eprosima -#include -#include - -namespace eprosima { -namespace fastrtps { -namespace rtps { - -using LocatorsIterator = eprosima::fastdds::rtps::LocatorsIterator; -using Locators = eprosima::fastdds::rtps::Locators; -using LocatorList_t = eprosima::fastdds::rtps::LocatorList; - -} // namespace rtps -} // namespace fastrtps -} // namespace eprosima - #endif /* _FASTDDS_RTPS_ELEM_LOCATOR_H_ */ diff --git a/include/fastdds/rtps/common/LocatorList.hpp b/include/fastdds/rtps/common/LocatorList.hpp index 9801fb9426d..40af3503443 100644 --- a/include/fastdds/rtps/common/LocatorList.hpp +++ b/include/fastdds/rtps/common/LocatorList.hpp @@ -326,32 +326,6 @@ class LocatorList } } - FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastrtps::rtps::LocatorList::contains(const Locator&)", - "Unused method.") - RTPS_DllAPI bool contains( - const Locator& loc) - { - for (LocatorListIterator it = this->begin(); it != this->end(); ++it) - { - if (IsAddressDefined(*it)) - { - if (loc == *it) - { - return true; - } - } - else - { - if (loc.kind == (*it).kind && loc.port == (*it).port) - { - return true; - } - } - } - - return false; - } - /** * @brief Check that every locator contained in the list is not LOCATOR_KIND_INVALID. * @@ -484,6 +458,15 @@ inline std::istream& operator >>( } // namespace rtps } // namespace fastdds + +namespace fastrtps { +namespace rtps { + +using Locators = eprosima::fastdds::rtps::Locators; +using LocatorList_t = eprosima::fastdds::rtps::LocatorList; + +} // namespace rtps +} // namespace fastrtps } // namespace eprosima #endif /* _FASTDDS_RTPS_COMMON_LOCATORLIST_HPP_ */ diff --git a/include/fastdds/rtps/common/LocatorSelector.hpp b/include/fastdds/rtps/common/LocatorSelector.hpp index 399d104d3cc..fed661e95e5 100644 --- a/include/fastdds/rtps/common/LocatorSelector.hpp +++ b/include/fastdds/rtps/common/LocatorSelector.hpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include diff --git a/include/fastdds/rtps/common/LocatorSelectorEntry.hpp b/include/fastdds/rtps/common/LocatorSelectorEntry.hpp index 75c59df0458..25e6138abc8 100644 --- a/include/fastdds/rtps/common/LocatorSelectorEntry.hpp +++ b/include/fastdds/rtps/common/LocatorSelectorEntry.hpp @@ -23,6 +23,7 @@ #include #include +#include #include namespace eprosima { diff --git a/include/fastdds/rtps/common/LocatorsIterator.hpp b/include/fastdds/rtps/common/LocatorsIterator.hpp index b9480237f49..3d880e8db7b 100644 --- a/include/fastdds/rtps/common/LocatorsIterator.hpp +++ b/include/fastdds/rtps/common/LocatorsIterator.hpp @@ -65,6 +65,14 @@ struct LocatorsIterator } // namespace rtps } // namespace fastdds + +namespace fastrtps { +namespace rtps { + +using LocatorsIterator = eprosima::fastdds::rtps::LocatorsIterator; + +} // namespace rtps +} // namespace fastrtps } // namespace eprosima #endif /* _FASTDDS_RTPS_COMMON_LOCATORSITERATOR_HPP_ */ diff --git a/include/fastdds/rtps/common/Types.h b/include/fastdds/rtps/common/Types.h index 7219bdd77a6..9533687ae4d 100644 --- a/include/fastdds/rtps/common/Types.h +++ b/include/fastdds/rtps/common/Types.h @@ -163,7 +163,7 @@ const ProtocolVersion_t c_ProtocolVersion_2_3{2, 3}; const ProtocolVersion_t c_ProtocolVersion; //!@brief Structure VendorId_t, specifying the vendor Id of the implementation. -FASTDDS_TODO_BEFORE(3, 0, "Remove eprosima::fastrtps::rtps::VendorId_t usings"); +// FASTDDS_TODO_BEFORE(3, 0, "Remove eprosima::fastrtps::rtps::VendorId_t usings"); using VendorId_t = eprosima::fastdds::rtps::VendorId_t; using eprosima::fastdds::rtps::c_VendorId_Unknown; using eprosima::fastdds::rtps::c_VendorId_eProsima; diff --git a/include/fastdds/rtps/history/History.h b/include/fastdds/rtps/history/History.h index 2270cc8802d..58947ada939 100644 --- a/include/fastdds/rtps/history/History.h +++ b/include/fastdds/rtps/history/History.h @@ -64,48 +64,6 @@ class History //!Attributes of the History HistoryAttributes m_att; - /** - * Reserve a CacheChange_t from the CacheChange pool. - * @param[out] change Pointer to pointer to the CacheChange_t to reserve - * @param[in] calculateSizeFunc Function to calculate the size of the payload. - * @return True if reserved - * @warning This method has been deprecated and will be removed on v3.0.0 - */ - FASTRTPS_DEPRECATED("Use new_change on RTPSWriter or reserveCache on RTPSReader") - RTPS_DllAPI inline bool reserve_Cache( - CacheChange_t** change, - const std::function& calculateSizeFunc) - { - return do_reserve_cache(change, calculateSizeFunc()); - } - - /** - * Reserve a CacheChange_t from the CacheChange pool. - * @param[out] change Pointer to pointer to the CacheChange_t to reserve - * @param[in] dataSize Required size for the payload. - * @return True if reserved - * @warning This method has been deprecated and will be removed on v3.0.0 - */ - FASTRTPS_DEPRECATED("Use new_change on RTPSWriter or reserveCache on RTPSReader") - RTPS_DllAPI inline bool reserve_Cache( - CacheChange_t** change, - uint32_t dataSize) - { - return do_reserve_cache(change, dataSize); - } - - /** - * release a previously reserved CacheChange_t. - * @param ch Pointer to the CacheChange_t. - * @warning This method has been deprecated and will be removed on v3.0.0 - */ - FASTRTPS_DEPRECATED("Use release_change on RTPSWriter or releaseCache on RTPSReader") - RTPS_DllAPI inline void release_Cache( - CacheChange_t* ch) - { - do_release_cache(ch); - } - /** * Check if the history is full * @return true if the History is full. diff --git a/include/fastdds/rtps/participant/RTPSParticipant.h b/include/fastdds/rtps/participant/RTPSParticipant.h index 1b3a19abd56..a4183117c33 100644 --- a/include/fastdds/rtps/participant/RTPSParticipant.h +++ b/include/fastdds/rtps/participant/RTPSParticipant.h @@ -23,13 +23,13 @@ #include #include -#include +#include +#include #include #include +#include #include #include -#include -#include namespace eprosima { @@ -155,7 +155,7 @@ class RTPS_DllAPI RTPSParticipant bool registerWriter( RTPSWriter* Writer, const TopicAttributes& topicAtt, - const WriterQos& wqos); + const fastdds::dds::WriterQos& wqos); /** * Register a RTPSReader in the builtin Protocols. @@ -168,7 +168,7 @@ class RTPS_DllAPI RTPSParticipant bool registerReader( RTPSReader* Reader, const TopicAttributes& topicAtt, - const ReaderQos& rqos, + const fastdds::dds::ReaderQos& rqos, const fastdds::rtps::ContentFilterProperty* content_filter = nullptr); /** @@ -188,7 +188,7 @@ class RTPS_DllAPI RTPSParticipant bool updateWriter( RTPSWriter* Writer, const TopicAttributes& topicAtt, - const WriterQos& wqos); + const fastdds::dds::WriterQos& wqos); /** * Update reader QOS @@ -201,7 +201,7 @@ class RTPS_DllAPI RTPSParticipant bool updateReader( RTPSReader* Reader, const TopicAttributes& topicAtt, - const ReaderQos& rqos, + const fastdds::dds::ReaderQos& rqos, const fastdds::rtps::ContentFilterProperty* content_filter = nullptr); /** diff --git a/include/fastdds/rtps/reader/RTPSReader.h b/include/fastdds/rtps/reader/RTPSReader.h index 6db4528e617..6cec9fbfbff 100644 --- a/include/fastdds/rtps/reader/RTPSReader.h +++ b/include/fastdds/rtps/reader/RTPSReader.h @@ -21,6 +21,7 @@ #include +#include #include #include #include @@ -31,7 +32,6 @@ #include #include #include -#include #include namespace eprosima { @@ -285,7 +285,7 @@ class RTPSReader virtual bool isInCleanState() = 0; //! The liveliness changed status struct as defined in the DDS - LivelinessChangedStatus liveliness_changed_status_; + fastdds::dds::LivelinessChangedStatus liveliness_changed_status_; inline void enableMessagesFromUnkownWriters( bool enable) diff --git a/include/fastdds/rtps/security/logging/Logging.h b/include/fastdds/rtps/security/logging/Logging.h index 340d5bf9a43..51ccbc1658b 100644 --- a/include/fastdds/rtps/security/logging/Logging.h +++ b/include/fastdds/rtps/security/logging/Logging.h @@ -233,9 +233,9 @@ bool Logging::compose_header( // gcc expands __VA_ARGS___ before passing it into the macro. // Visual Studio expands __VA_ARGS__ after passing it. // This macro is a workaround to support both -#define __FASTRTPS_EXPAND(x) x +#define __FASTDDS_EXPAND(x) x -#define __FASTRTPS_SECURITY_LOGGING(LEVEL, CLASS, MESSAGE, EXCEPTION) \ +#define __FASTDDS_SECURITY_LOGGING(LEVEL, CLASS, MESSAGE, EXCEPTION) \ do { \ auto logger = get_logger(); \ if (logger){ \ @@ -264,19 +264,19 @@ bool Logging::compose_header( } \ } while (0); -#define __FASTRTPS_SECURITY_LOGGING_EX(LEVEL, CLASS, MESSAGE) \ +#define __FASTDDS_SECURITY_LOGGING_EX(LEVEL, CLASS, MESSAGE) \ do { \ eprosima::fastrtps::rtps::security::SecurityException lexception; \ - __FASTRTPS_SECURITY_LOGGING(LEVEL, CLASS, MESSAGE, lexception); \ + __FASTDDS_SECURITY_LOGGING(LEVEL, CLASS, MESSAGE, lexception); \ } while (0); -#define __FASTRTPS_MACRO_SELECTOR(_1, _2, _3, _4, NAME, ...) NAME +#define __FASTDDS_MACRO_SELECTOR(_1, _2, _3, _4, NAME, ...) NAME #define SECURITY_LOGGING(...) \ - __FASTRTPS_EXPAND( \ - __FASTRTPS_MACRO_SELECTOR(__VA_ARGS__, \ - __FASTRTPS_SECURITY_LOGGING, \ - __FASTRTPS_SECURITY_LOGGING_EX, \ + __FASTDDS_EXPAND( \ + __FASTDDS_MACRO_SELECTOR(__VA_ARGS__, \ + __FASTDDS_SECURITY_LOGGING, \ + __FASTDDS_SECURITY_LOGGING_EX, \ _UNUSED)(__VA_ARGS__)) #define EMERGENCY_SECURITY_LOGGING(...) SECURITY_LOGGING(LoggingLevel::EMERGENCY_LEVEL, __VA_ARGS__) diff --git a/include/fastdds/rtps/transport/ChainingTransportDescriptor.h b/include/fastdds/rtps/transport/ChainingTransportDescriptor.h index dad7bf74884..85ed7bb66f6 100644 --- a/include/fastdds/rtps/transport/ChainingTransportDescriptor.h +++ b/include/fastdds/rtps/transport/ChainingTransportDescriptor.h @@ -69,7 +69,7 @@ typedef struct ChainingTransportDescriptor : public TransportDescriptorInterface } ChainingTransportDescriptor; } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima #endif // _FASTDDS_RTPS_TRANSPORT_CHAININGTRANSPORTDESCRIPTOR_H_ diff --git a/include/fastdds/rtps/transport/SenderResource.h b/include/fastdds/rtps/transport/SenderResource.h index b6a2b060bc1..4a2f272451d 100644 --- a/include/fastdds/rtps/transport/SenderResource.h +++ b/include/fastdds/rtps/transport/SenderResource.h @@ -21,7 +21,8 @@ #include #include -#include +#include +#include namespace eprosima { namespace fastrtps { diff --git a/include/fastdds/rtps/transport/TCPTransportDescriptor.h b/include/fastdds/rtps/transport/TCPTransportDescriptor.h index d96a7d42903..a930c8467ab 100644 --- a/include/fastdds/rtps/transport/TCPTransportDescriptor.h +++ b/include/fastdds/rtps/transport/TCPTransportDescriptor.h @@ -266,10 +266,6 @@ struct TCPTransportDescriptor : public SocketTransportDescriptor //! Enables the TCP_NODELAY socket option bool enable_tcp_nodelay; - - FASTDDS_TODO_BEFORE(3, 0, "Eliminate wait_for_tcp_negotiation, variable not in use."); - bool wait_for_tcp_negotiation; - //! Enables the calculation and sending of CRC on message headers bool calculate_crc; //! Enables checking the CRC of incoming message headers diff --git a/include/fastdds/rtps/transport/TransportInterface.h b/include/fastdds/rtps/transport/TransportInterface.h index 8ff96ee76f7..b36c5d40a07 100644 --- a/include/fastdds/rtps/transport/TransportInterface.h +++ b/include/fastdds/rtps/transport/TransportInterface.h @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -50,7 +51,7 @@ using NetmaskFilterInfo = std::pair; /** - * Interface against which to implement a transport layer, decoupled from FastRTPS internals. + * Interface against which to implement a transport layer, decoupled from Fast DDS internals. * TransportInterface expects the user to implement a logical equivalence between Locators and protocol-specific "channels". * This equivalence can be narrowing: For instance in UDP/IP, a port would take the role of channel, and several different * locators can map to the same port, and hence the same channel. diff --git a/include/fastdds/rtps/writer/IReaderDataFilter.hpp b/include/fastdds/rtps/writer/IReaderDataFilter.hpp deleted file mode 100644 index 5331d7b8173..00000000000 --- a/include/fastdds/rtps/writer/IReaderDataFilter.hpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2020 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file IReaderDataFilter.hpp - */ - -// This file was moved as part of the implementation of content filtered topics -#include - -FASTDDS_TODO_BEFORE(3, 0, "This header should be removed"); diff --git a/include/fastdds/rtps/writer/LivelinessData.h b/include/fastdds/rtps/writer/LivelinessData.h index f33b7bbcf82..f095bf50af0 100644 --- a/include/fastdds/rtps/writer/LivelinessData.h +++ b/include/fastdds/rtps/writer/LivelinessData.h @@ -18,11 +18,11 @@ #ifndef _FASTDDS_RTPS_LIVELINESS_DATA_H_ #define _FASTDDS_RTPS_LIVELINESS_DATA_H_ -#include -#include - #include +#include +#include + namespace eprosima { namespace fastrtps { namespace rtps { @@ -51,30 +51,33 @@ struct LivelinessData */ LivelinessData( GUID_t guid_in, - LivelinessQosPolicyKind kind_in, + fastdds::dds::LivelinessQosPolicyKind kind_in, Duration_t lease_duration_in) : guid(guid_in) , kind(kind_in) , lease_duration(lease_duration_in) , status(WriterStatus::NOT_ASSERTED) - {} + { + } LivelinessData() : guid() - , kind(LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS) + , kind(fastdds::dds::LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS) , lease_duration(TIME_T_INFINITE_SECONDS, TIME_T_INFINITE_NANOSECONDS) , status(WriterStatus::NOT_ASSERTED) - {} + { + } ~LivelinessData() - {} + { + } /** * @brief Equality operator * @param other Liveliness data to compare to * @return True if equal */ - bool operator==( + bool operator ==( const LivelinessData& other) const { return ((guid == other.guid) && @@ -87,17 +90,17 @@ struct LivelinessData * @param other Liveliness data to compare to * @return True if different */ - bool operator!=( + bool operator !=( const LivelinessData& other) const { - return (!operator==(other)); + return (!operator ==(other)); } //! GUID of the writer GUID_t guid; //! Writer liveliness kind - LivelinessQosPolicyKind kind; + fastdds::dds::LivelinessQosPolicyKind kind; //! The lease duration Duration_t lease_duration; diff --git a/include/fastdds/rtps/writer/LivelinessManager.h b/include/fastdds/rtps/writer/LivelinessManager.h index a8efa9fecfd..52b50cbeb8f 100644 --- a/include/fastdds/rtps/writer/LivelinessManager.h +++ b/include/fastdds/rtps/writer/LivelinessManager.h @@ -31,7 +31,7 @@ namespace rtps { using LivelinessCallback = std::function; @@ -77,7 +77,7 @@ class LivelinessManager */ bool add_writer( GUID_t guid, - LivelinessQosPolicyKind kind, + fastdds::dds::LivelinessQosPolicyKind kind, Duration_t lease_duration); /** @@ -89,7 +89,7 @@ class LivelinessManager */ bool remove_writer( GUID_t guid, - LivelinessQosPolicyKind kind, + fastdds::dds::LivelinessQosPolicyKind kind, Duration_t lease_duration); /** @@ -101,7 +101,7 @@ class LivelinessManager */ bool assert_liveliness( GUID_t guid, - LivelinessQosPolicyKind kind, + fastdds::dds::LivelinessQosPolicyKind kind, Duration_t lease_duration); /** @@ -111,7 +111,7 @@ class LivelinessManager * @return True if liveliness was successfully asserted */ bool assert_liveliness( - LivelinessQosPolicyKind kind, + fastdds::dds::LivelinessQosPolicyKind kind, GuidPrefix_t guid_prefix); /** @@ -120,7 +120,7 @@ class LivelinessManager * @return True if at least one writer of this kind is alive. False otherwise */ bool is_any_alive( - LivelinessQosPolicyKind kind); + fastdds::dds::LivelinessQosPolicyKind kind); /** * @brief A method to return liveliness data diff --git a/include/fastdds/rtps/writer/RTPSWriter.h b/include/fastdds/rtps/writer/RTPSWriter.h index 6faad6b225a..15b4c6db293 100644 --- a/include/fastdds/rtps/writer/RTPSWriter.h +++ b/include/fastdds/rtps/writer/RTPSWriter.h @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -34,15 +35,11 @@ #include #include #include +#include +#include #include -#include - - -#include "DeliveryRetCode.hpp" -#include "LocatorSelectorSender.hpp" namespace eprosima { - namespace fastdds { namespace rtps { diff --git a/include/fastrtps/config/doxygen_modules.h b/include/fastrtps/config/doxygen_modules.h index 9df7c40aa50..de263a30fdc 100644 --- a/include/fastrtps/config/doxygen_modules.h +++ b/include/fastrtps/config/doxygen_modules.h @@ -22,30 +22,27 @@ //Description of doxygen modules, not used in actual code. /*! - * @defgroup FASTRTPS_GENERAL_API eProsima Fast RTPS API Reference - * @brief eProsima Fast RTPS API grouped in modules. + * @defgroup FASTDDS_GENERAL_API eProsima Fast DDS API Reference + * @brief eProsima Fast DDS API grouped in modules. */ - - /*! * @defgroup RTPS_MODULE RTPS - * @ingroup FASTRTPS_GENERAL_API + * @ingroup FASTDDS_GENERAL_API * @brief RTPS API * This is an implementation of the RTPS communication standard defined by the OMG. */ - /*! - * @defgroup FASTRTPS_MODULE Publisher Subscriber Public API - * @ingroup FASTRTPS_GENERAL_API - * @brief Publisher Subscriber Public API - * This Module contains the Publisher Subscriber Layer created to facilitate the use of the RTPS protocol. + * @defgroup FASTDDS_MODULE DDS Public API + * @ingroup FASTDDS_GENERAL_API + * @brief DDS Public API + * This Module contains the DDS Layer defined by the OMG. */ -/** @defgroup FASTRTPS_ATTRIBUTES_MODULE Fast RTPS Attributes Module. - * @ingroup FASTRTPS_MODULE - * @brief Attributes class used to define the public entities that the user should use to control this library. +/** @defgroup FASTDDS_QOS_MODULE Fast DDS Quality of Service (QoS) Module. + * @ingroup FASTDDS_MODULE + * @brief QOS class used to define the public entities that the user should use to control this library. */ /** @defgroup RTPS_ATTRIBUTES_MODULE RTPS Attributes Module. @@ -53,7 +50,6 @@ * @brief Attributes class used to define the public entities that the user should use to control this library. */ - /** @defgroup COMMON_MODULE Common Module. * @ingroup RTPS_MODULE * Common structures used by multiple elements. @@ -61,8 +57,7 @@ /** @defgroup NETWORK_MODULE Network Module * @ingroup RTPS_MODULE - * Includes the elements necessary to interface between the - * transport layer and the FastRTPS library. + * Includes the elements necessary to interface between the transport layer and the Fast DDS library. */ /** @defgroup TRANSPORT_MODULE Transport Module. @@ -98,9 +93,9 @@ */ /** @defgroup MANAGEMENT_MODULE Management Module - * @ingroup FASTRTPS_GENERAL_API - * This module contains classes and methods associated with the management of all other objects. The most important ones - * are the communication (ResourceSend and ResourceListen) and event (ResourceEvent) resources. + * @ingroup FASTDDS_GENERAL_API + * This module contains classes and methods associated with the management of all other objects. + * The most important ones are the communication (ResourceSend and ResourceListen) and event (ResourceEvent) resources. */ /** @defgroup BUILTIN_MODULE Builtin Protocols Module @@ -126,23 +121,18 @@ #endif // ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC /** @defgroup UTILITIES_MODULE Shared Utilities - * @ingroup FASTRTPS_GENERAL_API - * Shared utilities that can be used by one or more classes in different modules. They are not strictly part of the RTPS implementation - * but very useful to implement different functionalities. + * @ingroup FASTDDS_GENERAL_API + * Shared utilities that can be used by one or more classes in different modules. + * They are not strictly part of the RTPS implementation but very useful to implement different functionalities. */ /** * @namespace eprosima eProsima namespace. - * @ingroup FASTRTPS_GENERAL_API - */ - -/** - * @namespace eprosima::fastrtps Contains the publisher subscriber layer. - * @ingroup FASTRTPS_MODULE + * @ingroup FASTDDS_GENERAL_API */ /** - * @namespace eprosima::fastrtps::rtps Contains the RTPS protocol implementation + * @namespace eprosima::fastdds::rtps Contains the RTPS protocol implementation * @ingroup RTPS_MODULE */ diff --git a/include/fastrtps/eProsima_auto_link.h b/include/fastrtps/eProsima_auto_link.h index 9819c40bfee..ba102ea87b7 100644 --- a/include/fastrtps/eProsima_auto_link.h +++ b/include/fastrtps/eProsima_auto_link.h @@ -13,12 +13,12 @@ // limitations under the License. /* - Expected defines. + Expected defines. - - EPROSIMA_LIB_NAME - - FASTRTPS_VERSION_MAJOR - - FASTRTPS_VERSION_MINOR -*/ + - EPROSIMA_LIB_NAME + - FASTDDS_VERSION_MAJOR + - FASTDDS_VERSION_MINOR + */ #if defined(_MSC_VER) #define EPROSIMA_STRINGIZE(X) EPROSIMA_DO_STRINGIZE(X) @@ -30,37 +30,38 @@ #define EPROSIMA_LIB_DEBUG_TAG #endif // _DEBUG - // Select linkage option. +// Select linkage option. #if (defined(_DLL) || defined(_RTLDLL)) && defined(EPROSIMA_DYN_LINK) #define EPROSIMA_LIB_PREFIX #elif defined(EPROSIMA_DYN_LINK) #error "Mixing a dll eprosima library with a static runtime is a bad idea" #else #define EPROSIMA_LIB_PREFIX "lib" - #endif + #endif // if (defined(_DLL) || defined(_RTLDLL)) && defined(EPROSIMA_DYN_LINK) - // Include library +// Include library #if defined(EPROSIMA_LIB_NAME) \ - && defined(EPROSIMA_LIB_PREFIX) \ - && defined(EPROSIMA_LIB_DEBUG_TAG) \ - && defined(FASTRTPS_VERSION_MAJOR) \ - && defined(FASTRTPS_VERSION_MINOR) - #pragma comment(lib, EPROSIMA_LIB_PREFIX EPROSIMA_STRINGIZE(EPROSIMA_LIB_NAME) EPROSIMA_LIB_DEBUG_TAG "-" EPROSIMA_STRINGIZE(FASTRTPS_VERSION_MAJOR) "." EPROSIMA_STRINGIZE(FASTRTPS_VERSION_MINOR) ".lib") + && defined(EPROSIMA_LIB_PREFIX) \ + && defined(EPROSIMA_LIB_DEBUG_TAG) \ + && defined(FASTDDS_VERSION_MAJOR) \ + && defined(FASTDDS_VERSION_MINOR) + #pragma \ + comment(lib, EPROSIMA_LIB_PREFIX EPROSIMA_STRINGIZE(EPROSIMA_LIB_NAME) EPROSIMA_LIB_DEBUG_TAG "-" EPROSIMA_STRINGIZE(FASTDDS_VERSION_MAJOR) "." EPROSIMA_STRINGIZE(FASTDDS_VERSION_MINOR) ".lib") #else #error "Some required macros where not defined" - #endif + #endif // if defined(EPROSIMA_LIB_NAME) && defined(EPROSIMA_LIB_PREFIX) && defined(EPROSIMA_LIB_DEBUG_TAG) && defined(FASTDDS_VERSION_MAJOR) && defined(FASTDDS_VERSION_MINOR) #endif // _MSC_VER - + // Undef macros #ifdef EPROSIMA_LIB_PREFIX #undef EPROSIMA_LIB_PREFIX -#endif +#endif // ifdef EPROSIMA_LIB_PREFIX #ifdef EPROSIMA_LIB_NAME #undef EPROSIMA_LIB_NAME -#endif +#endif // ifdef EPROSIMA_LIB_NAME #ifdef EPROSIMA_LIB_DEBUG_TAG #undef EPROSIMA_LIB_DEBUG_TAG -#endif +#endif // ifdef EPROSIMA_LIB_DEBUG_TAG diff --git a/include/fastrtps/fastrtps_dll.h b/include/fastrtps/fastrtps_dll.h index b03190a9807..a86cc5a55b8 100644 --- a/include/fastrtps/fastrtps_dll.h +++ b/include/fastrtps/fastrtps_dll.h @@ -12,58 +12,58 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef _FASTRTPS_FASTRTPS_DLL_H_ -#define _FASTRTPS_FASTRTPS_DLL_H_ +#ifndef _FASTDDS_FASTDDS_DLL_H_ +#define _FASTDDS_FASTDDS_DLL_H_ -#include +#include // normalize macros -#if !defined(FASTRTPS_DYN_LINK) && !defined(FASTRTPS_STATIC_LINK) \ +#if !defined(FASTDDS_DYN_LINK) && !defined(FASTDDS_STATIC_LINK) \ && !defined(EPROSIMA_ALL_DYN_LINK) && !defined(EPROSIMA_ALL_STATIC_LINK) -#define FASTRTPS_STATIC_LINK -#endif +#define FASTDDS_STATIC_LINK +#endif // if !defined(FASTDDS_DYN_LINK) && !defined(FASTDDS_STATIC_LINK) && !defined(EPROSIMA_ALL_DYN_LINK) && !defined(EPROSIMA_ALL_STATIC_LINK) -#if defined(EPROSIMA_ALL_DYN_LINK) && !defined(FASTRTPS_DYN_LINK) -#define FASTRTPS_DYN_LINK -#endif +#if defined(EPROSIMA_ALL_DYN_LINK) && !defined(FASTDDS_DYN_LINK) +#define FASTDDS_DYN_LINK +#endif // if defined(EPROSIMA_ALL_DYN_LINK) && !defined(FASTDDS_DYN_LINK) -#if defined(FASTRTPS_DYN_LINK) && defined(FASTRTPS_STATIC_LINK) -#error Must not define both FASTRTPS_DYN_LINK and FASTRTPS_STATIC_LINK -#endif +#if defined(FASTDDS_DYN_LINK) && defined(FASTDDS_STATIC_LINK) +#error Must not define both FASTDDS_DYN_LINK and FASTDDS_STATIC_LINK +#endif // if defined(FASTDDS_DYN_LINK) && defined(FASTDDS_STATIC_LINK) -#if defined(EPROSIMA_ALL_NO_LIB) && !defined(FASTRTPS_NO_LIB) -#define FASTRTPS_NO_LIB -#endif +#if defined(EPROSIMA_ALL_NO_LIB) && !defined(FASTDDS_NO_LIB) +#define FASTDDS_NO_LIB +#endif // if defined(EPROSIMA_ALL_NO_LIB) && !defined(FASTDDS_NO_LIB) // enable dynamic linking #if defined(_WIN32) -#if defined(EPROSIMA_ALL_DYN_LINK) || defined(FASTRTPS_DYN_LINK) -#if defined(fastrtps_EXPORTS) +#if defined(EPROSIMA_ALL_DYN_LINK) || defined(FASTDDS_DYN_LINK) +#if defined(fastdds_EXPORTS) #define RTPS_DllAPI __declspec( dllexport ) #else #define RTPS_DllAPI __declspec( dllimport ) -#endif // FASTRTPS_SOURCE +#endif // FASTDDS_SOURCE #else #define RTPS_DllAPI -#endif +#endif // if defined(EPROSIMA_ALL_DYN_LINK) || defined(FASTDDS_DYN_LINK) #else #define RTPS_DllAPI #endif // _WIN32 // Auto linking. -#if !defined(FASTRTPS_SOURCE) && !defined(EPROSIMA_ALL_NO_LIB) \ - && !defined(FASTRTPS_NO_LIB) +#if !defined(FASTDDS_SOURCE) && !defined(EPROSIMA_ALL_NO_LIB) \ + && !defined(FASTDDS_NO_LIB) // Set properties. -#define EPROSIMA_LIB_NAME fastrtps +#define EPROSIMA_LIB_NAME fastdds -#if defined(EPROSIMA_ALL_DYN_LINK) || defined(FASTRTPS_DYN_LINK) +#if defined(EPROSIMA_ALL_DYN_LINK) || defined(FASTDDS_DYN_LINK) #define EPROSIMA_DYN_LINK -#endif +#endif // if defined(EPROSIMA_ALL_DYN_LINK) || defined(FASTDDS_DYN_LINK) #include #endif // auto-linking disabled -#endif // _fastrtps_fastrtps_DLL_H_ +#endif // _FASTDDS_FASTDDS_DLL_H_ diff --git a/include/fastrtps/publisher/Publisher.h b/include/fastrtps/publisher/Publisher.h index 7f2ca22d864..9605d7a7bf2 100644 --- a/include/fastrtps/publisher/Publisher.h +++ b/include/fastrtps/publisher/Publisher.h @@ -63,8 +63,6 @@ class RTPS_DllAPI Publisher * @return true when operation works successfully. * @note This method is blocked for a period of time. * ReliabilityQosPolicy.max_blocking_time on PublisherAttributes defines this period of time. - * @par Calling example: - * @snippet fastrtps_example.cpp ex_PublisherWrite */ bool write( void* sample); @@ -76,8 +74,6 @@ class RTPS_DllAPI Publisher * @return true when operation works successfully. * @note This method is blocked for a period of time. * ReliabilityQosPolicy.max_blocking_time on PublisherAttributes defines this period of time. - * @par Calling example: - * @snippet fastrtps_example.cpp ex_PublisherWrite */ bool write( void* sample, diff --git a/include/fastrtps/publisher/PublisherListener.h b/include/fastrtps/publisher/PublisherListener.h index 04107aa2dcf..7775b90a758 100644 --- a/include/fastrtps/publisher/PublisherListener.h +++ b/include/fastrtps/publisher/PublisherListener.h @@ -30,8 +30,6 @@ class Publisher; /** * Class PublisherListener, allows the end user to implement callbacks triggered by certain events. - * @ingroup FASTRTPS_MODULE - * @snippet fastrtps_example.cpp ex_PublisherListener */ class RTPS_DllAPI PublisherListener { diff --git a/include/fastrtps/subscriber/Subscriber.h b/include/fastrtps/subscriber/Subscriber.h index 30913ec7d7c..0b50005ba21 100644 --- a/include/fastrtps/subscriber/Subscriber.h +++ b/include/fastrtps/subscriber/Subscriber.h @@ -37,8 +37,6 @@ class SampleInfo_t; * Class Subscriber, contains the public API that allows the user to control the reception of messages. * This class should not be instantiated directly. * DomainRTPSParticipant class should be used to correctly create this element. - * @ingroup FASTRTPS_MODULE - * @snippet fastrtps_example.cpp ex_Subscriber */ class RTPS_DllAPI Subscriber { diff --git a/include/fastrtps/subscriber/SubscriberListener.h b/include/fastrtps/subscriber/SubscriberListener.h index 572c540d037..140b98e8ac5 100644 --- a/include/fastrtps/subscriber/SubscriberListener.h +++ b/include/fastrtps/subscriber/SubscriberListener.h @@ -34,64 +34,67 @@ class Subscriber; /** * Class SubscriberListener, it should be used by the end user to implement specific callbacks to certain actions. - * @ingroup FASTRTPS_MODULE - * @snippet fastrtps_example.cpp ex_SubscriberListener */ class RTPS_DllAPI SubscriberListener { - public: - - SubscriberListener(){} - - virtual ~SubscriberListener(){} - - /** - * Virtual function to be implemented by the user containing the actions to be performed when a new Data Message is received. - * @param sub Subscriber - */ - virtual void onNewDataMessage(Subscriber* sub) - { - (void)sub; - } - - /** - * Virtual method to be called when the subscriber is matched with a new Writer (or unmatched); i.e., when a writer publishing in the same topic is discovered. - * @param sub Subscriber - * @param info Matching information - */ - virtual void onSubscriptionMatched( - Subscriber* sub, - rtps::MatchingInfo& info) - { - (void)sub; - (void)info; - } - - /** - * Virtual method to be called when a topic misses the deadline period - * @param sub Subscriber - * @param status The requested deadline missed status - */ - virtual void on_requested_deadline_missed( - Subscriber* sub, - const RequestedDeadlineMissedStatus& status) - { - (void)sub; - (void)status; - } - - /** - * @brief Method called when the liveliness status associated to a subscriber changes - * @param sub The subscriber - * @param status The liveliness changed status - */ - virtual void on_liveliness_changed( - Subscriber* sub, - const LivelinessChangedStatus& status) - { - (void)sub; - (void)status; - } +public: + + SubscriberListener() + { + } + + virtual ~SubscriberListener() + { + } + + /** + * Virtual function to be implemented by the user containing the actions to be performed when a new Data Message is received. + * @param sub Subscriber + */ + virtual void onNewDataMessage( + Subscriber* sub) + { + (void)sub; + } + + /** + * Virtual method to be called when the subscriber is matched with a new Writer (or unmatched); i.e., when a writer publishing in the same topic is discovered. + * @param sub Subscriber + * @param info Matching information + */ + virtual void onSubscriptionMatched( + Subscriber* sub, + rtps::MatchingInfo& info) + { + (void)sub; + (void)info; + } + + /** + * Virtual method to be called when a topic misses the deadline period + * @param sub Subscriber + * @param status The requested deadline missed status + */ + virtual void on_requested_deadline_missed( + Subscriber* sub, + const RequestedDeadlineMissedStatus& status) + { + (void)sub; + (void)status; + } + + /** + * @brief Method called when the liveliness status associated to a subscriber changes + * @param sub The subscriber + * @param status The liveliness changed status + */ + virtual void on_liveliness_changed( + Subscriber* sub, + const LivelinessChangedStatus& status) + { + (void)sub; + (void)status; + } }; diff --git a/include/fastrtps/types/AnnotationParameterValue.h b/include/fastrtps/types/AnnotationParameterValue.h index 91f22781f8b..e4cbd96dd48 100644 --- a/include/fastrtps/types/AnnotationParameterValue.h +++ b/include/fastrtps/types/AnnotationParameterValue.h @@ -103,39 +103,6 @@ class ExtendedAnnotationParameterValue RTPS_DllAPI ExtendedAnnotationParameterValue& operator =( ExtendedAnnotationParameterValue&& x); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, - "eprosima::fastrtps::types::ExtendedAnnotationParameterValue::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const ExtendedAnnotationParameterValue& data, - size_t current_alignment = 0); - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::ExtendedAnnotationParameterValue::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::ExtendedAnnotationParameterValue::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - /*! * @brief This function returns the maximum serialized size of the Key of an object * depending on the buffer alignment. @@ -596,38 +563,6 @@ class AnnotationParameterValue */ RTPS_DllAPI ExtendedAnnotationParameterValue& extended_value(); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AnnotationParameterValue::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const AnnotationParameterValue& data, - size_t current_alignment = 0); - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AnnotationParameterValue::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AnnotationParameterValue::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - /*! * @brief This function returns the maximum serialized size of the Key of an object * depending on the buffer alignment. @@ -945,38 +880,6 @@ class AppliedAnnotationParameter return m_value; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedAnnotationParameter::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const AppliedAnnotationParameter& data, - size_t current_alignment = 0); - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedAnnotationParameter::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedAnnotationParameter::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - /*! * @brief This function returns the maximum serialized size of the Key of an object * depending on the buffer alignment. @@ -1115,22 +1018,6 @@ class AppliedAnnotation return m_param_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedAnnotation::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const AppliedAnnotation& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedAnnotation::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedAnnotation::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI static size_t getKeyMaxCdrSerializedSize( size_t current_alignment = 0); RTPS_DllAPI static bool isKeyDefined(); @@ -1241,24 +1128,6 @@ class AppliedVerbatimAnnotation return m_text; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedVerbatimAnnotation::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const AppliedVerbatimAnnotation& data, - size_t current_alignment = 0); - - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedVerbatimAnnotation::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedVerbatimAnnotation::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI static size_t getKeyMaxCdrSerializedSize( size_t current_alignment = 0); @@ -1393,25 +1262,6 @@ class AppliedBuiltinMemberAnnotations return m_hash_id; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, - "eprosima::fastrtps::types::AppliedBuiltinMemberAnnotations::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const AppliedBuiltinMemberAnnotations& data, - size_t current_alignment = 0); - - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedBuiltinMemberAnnotations::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedBuiltinMemberAnnotations::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI static size_t getKeyMaxCdrSerializedSize( size_t current_alignment = 0); diff --git a/include/fastrtps/types/TypeIdentifier.h b/include/fastrtps/types/TypeIdentifier.h index b49cf48d396..63c7d43beae 100644 --- a/include/fastrtps/types/TypeIdentifier.h +++ b/include/fastrtps/types/TypeIdentifier.h @@ -360,38 +360,6 @@ class TypeIdentifier */ RTPS_DllAPI ExtendedTypeDefn& extended_defn(); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifier::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const TypeIdentifier& data, - size_t current_alignment = 0); - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifier::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifier::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - /** * Equals * */ diff --git a/include/fastrtps/types/TypeIdentifierTypes.h b/include/fastrtps/types/TypeIdentifierTypes.h index 553c6eab8c8..7354472dc6c 100644 --- a/include/fastrtps/types/TypeIdentifierTypes.h +++ b/include/fastrtps/types/TypeIdentifierTypes.h @@ -126,39 +126,6 @@ class StringSTypeDefn final return m_bound; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::StringSTypeDefn::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const StringSTypeDefn& data, - size_t current_alignment = 0); - - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::StringSTypeDefn::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::StringSTypeDefn::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool consistent( const StringSTypeDefn& x, const fastdds::dds::TypeConsistencyEnforcementQosPolicy& consistency) const; @@ -245,39 +212,6 @@ class StringLTypeDefn final return m_bound; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::StringLTypeDefn::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const StringLTypeDefn& data, - size_t current_alignment = 0); - - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::StringLTypeDefn::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::StringLTypeDefn::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool consistent( const StringLTypeDefn& x, const fastdds::dds::TypeConsistencyEnforcementQosPolicy& consistency) const; @@ -392,39 +326,6 @@ class PlainCollectionHeader final return m_element_flags; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainCollectionHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const PlainCollectionHeader& data, - size_t current_alignment = 0); - - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainCollectionHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainCollectionHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool consistent( const PlainCollectionHeader& x, const fastdds::dds::TypeConsistencyEnforcementQosPolicy& consistency) const; @@ -571,39 +472,6 @@ class PlainSequenceSElemDefn final return m_element_identifier; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainSequenceSElemDefn::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const PlainSequenceSElemDefn& data, - size_t current_alignment = 0); - - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainSequenceSElemDefn::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainSequenceSElemDefn::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool consistent( const PlainSequenceSElemDefn& x, const fastdds::dds::TypeConsistencyEnforcementQosPolicy& consistency) const; @@ -751,39 +619,6 @@ class PlainSequenceLElemDefn final return m_element_identifier; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainSequenceLElemDefn::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const PlainSequenceLElemDefn& data, - size_t current_alignment = 0); - - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainSequenceLElemDefn::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainSequenceLElemDefn::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool consistent( const PlainSequenceLElemDefn& x, const fastdds::dds::TypeConsistencyEnforcementQosPolicy& consistency) const; @@ -941,39 +776,6 @@ class PlainArraySElemDefn final return m_element_identifier; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainArraySElemDefn::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const PlainArraySElemDefn& data, - size_t current_alignment = 0); - - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainArraySElemDefn::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainArraySElemDefn::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool consistent( const PlainArraySElemDefn& x, const fastdds::dds::TypeConsistencyEnforcementQosPolicy& consistency) const; @@ -1131,39 +933,6 @@ class PlainArrayLElemDefn final return m_element_identifier; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainArrayLElemDefn::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const PlainArrayLElemDefn& data, - size_t current_alignment = 0); - - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainArrayLElemDefn::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainArrayLElemDefn::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool consistent( const PlainArrayLElemDefn& x, const fastdds::dds::TypeConsistencyEnforcementQosPolicy& consistency) const; @@ -1364,39 +1133,6 @@ class PlainMapSTypeDefn final return m_key_identifier; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainMapSTypeDefn::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const PlainMapSTypeDefn& data, - size_t current_alignment = 0); - - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainMapSTypeDefn::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainMapSTypeDefn::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool consistent( const PlainMapSTypeDefn& x, const fastdds::dds::TypeConsistencyEnforcementQosPolicy& consistency) const; @@ -1599,39 +1335,6 @@ class PlainMapLTypeDefn final return m_key_identifier; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainMapLTypeDefn::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const PlainMapLTypeDefn& data, - size_t current_alignment = 0); - - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainMapLTypeDefn::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::PlainMapLTypeDefn::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool consistent( const PlainMapLTypeDefn& x, const fastdds::dds::TypeConsistencyEnforcementQosPolicy& consistency) const; @@ -1784,39 +1487,6 @@ class StronglyConnectedComponentId final return m_scc_index; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::StronglyConnectedComponentId::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const StronglyConnectedComponentId& data, - size_t current_alignment = 0); - - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::StronglyConnectedComponentId::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::StronglyConnectedComponentId::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool consistent( const StronglyConnectedComponentId& x, const fastdds::dds::TypeConsistencyEnforcementQosPolicy& consistency) const; @@ -1873,39 +1543,6 @@ class ExtendedTypeDefn final RTPS_DllAPI virtual ExtendedTypeDefn& operator =( ExtendedTypeDefn&& x); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::ExtendedTypeDefn::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const ExtendedTypeDefn& data, - size_t current_alignment = 0); - - - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::ExtendedTypeDefn::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI virtual void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::ExtendedTypeDefn::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI virtual void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool consistent( const ExtendedTypeDefn& x, const fastdds::dds::TypeConsistencyEnforcementQosPolicy& consistency) const; diff --git a/include/fastrtps/types/TypeObject.h b/include/fastrtps/types/TypeObject.h index a755ddac2dd..6e2e9db2723 100644 --- a/include/fastrtps/types/TypeObject.h +++ b/include/fastrtps/types/TypeObject.h @@ -121,22 +121,6 @@ class CommonStructMember return m_member_type_id; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonStructMember::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonStructMember& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonStructMember::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonStructMember::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonStructMember& other) const; @@ -238,22 +222,6 @@ class CompleteMemberDetail return m_ann_custom; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteMemberDetail::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteMemberDetail& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteMemberDetail::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteMemberDetail::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteMemberDetail& other) const; @@ -310,22 +278,6 @@ class MinimalMemberDetail final return m_name_hash; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalMemberDetail::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalMemberDetail& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalMemberDetail::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalMemberDetail::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalMemberDetail& other) const; @@ -402,22 +354,6 @@ class CompleteStructMember return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteStructMember::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteStructMember& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteStructMember::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteStructMember::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteStructMember& other) const; @@ -498,22 +434,6 @@ class MinimalStructMember return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalStructMember::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalStructMember& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalStructMember::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalStructMember::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalStructMember& other) const; @@ -570,22 +490,6 @@ class AppliedBuiltinTypeAnnotations return m_verbatim; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedBuiltinTypeAnnotations::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const AppliedBuiltinTypeAnnotations& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedBuiltinTypeAnnotations::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::AppliedBuiltinTypeAnnotations::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const AppliedBuiltinTypeAnnotations& other) const; @@ -616,22 +520,6 @@ class MinimalTypeDetail RTPS_DllAPI MinimalTypeDetail& operator =( MinimalTypeDetail&& x); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalTypeDetail::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalTypeDetail& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalTypeDetail::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalTypeDetail::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalTypeDetail&) const { @@ -732,22 +620,6 @@ class CompleteTypeDetail return m_type_name; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteTypeDetail::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteTypeDetail& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteTypeDetail::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteTypeDetail::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteTypeDetail& other) const; @@ -824,22 +696,6 @@ class CompleteStructHeader return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteStructHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteStructHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteStructHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteStructHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteStructHeader& other) const; @@ -915,22 +771,6 @@ class MinimalStructHeader return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalStructHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalStructHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalStructHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalStructHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalStructHeader& other) const; @@ -1030,22 +870,6 @@ class CompleteStructType return m_member_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteStructType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteStructType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteStructType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteStructType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteStructType& other) const; @@ -1146,22 +970,6 @@ class MinimalStructType return m_member_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalStructType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalStructType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalStructType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalStructType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalStructType& other) const; @@ -1291,22 +1099,6 @@ class CommonUnionMember return m_label_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonUnionMember::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonUnionMember& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonUnionMember::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonUnionMember::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonUnionMember& other) const; @@ -1386,22 +1178,6 @@ class CompleteUnionMember return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteUnionMember::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteUnionMember& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteUnionMember::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteUnionMember::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteUnionMember& other) const; @@ -1482,22 +1258,6 @@ class MinimalUnionMember return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalUnionMember::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalUnionMember& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalUnionMember::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalUnionMember::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalUnionMember& other) const; @@ -1577,22 +1337,6 @@ class CommonDiscriminatorMember return m_type_id; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonDiscriminatorMember::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonDiscriminatorMember& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonDiscriminatorMember::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonDiscriminatorMember::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonDiscriminatorMember& other) const; @@ -1693,22 +1437,6 @@ class CompleteDiscriminatorMember return m_ann_custom; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteDiscriminatorMember::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteDiscriminatorMember& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteDiscriminatorMember::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteDiscriminatorMember::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteDiscriminatorMember& other) const; @@ -1764,22 +1492,6 @@ class MinimalDiscriminatorMember return m_common; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalDiscriminatorMember::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalDiscriminatorMember& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalDiscriminatorMember::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalDiscriminatorMember::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalDiscriminatorMember& other) const; @@ -1832,22 +1544,6 @@ class CompleteUnionHeader return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteUnionHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteUnionHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteUnionHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteUnionHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteUnionHeader& other) const; @@ -1900,22 +1596,6 @@ class MinimalUnionHeader return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalUnionHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalUnionHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalUnionHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalUnionHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalUnionHeader& other) const; @@ -2037,22 +1717,6 @@ class CompleteUnionType return m_member_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteUnionType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteUnionType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteUnionType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteUnionType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteUnionType& other) const; @@ -2177,22 +1841,6 @@ class MinimalUnionType return m_member_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalUnionType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalUnionType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalUnionType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalUnionType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalUnionType& other) const; @@ -2272,22 +1920,6 @@ class CommonAnnotationParameter return m_member_type_id; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonAnnotationParameter::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonAnnotationParameter& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonAnnotationParameter::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonAnnotationParameter::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonAnnotationParameter& other) const; @@ -2389,22 +2021,6 @@ class CompleteAnnotationParameter return m_default_value; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAnnotationParameter::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteAnnotationParameter& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAnnotationParameter::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAnnotationParameter::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteAnnotationParameter& other) const; @@ -2506,22 +2122,6 @@ class MinimalAnnotationParameter return m_default_value; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAnnotationParameter::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalAnnotationParameter& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAnnotationParameter::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAnnotationParameter::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalAnnotationParameter& other) const; @@ -2578,22 +2178,6 @@ class CompleteAnnotationHeader return m_annotation_name; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAnnotationHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteAnnotationHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAnnotationHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAnnotationHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteAnnotationHeader& other) const; @@ -2624,22 +2208,6 @@ class MinimalAnnotationHeader RTPS_DllAPI MinimalAnnotationHeader& operator =( MinimalAnnotationHeader&& x); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAnnotationHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalAnnotationHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAnnotationHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAnnotationHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalAnnotationHeader&) const { @@ -2740,22 +2308,6 @@ class CompleteAnnotationType final return m_member_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAnnotationType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteAnnotationType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAnnotationType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAnnotationType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteAnnotationType& other) const; @@ -2855,22 +2407,6 @@ class MinimalAnnotationType final return m_member_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAnnotationType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalAnnotationType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAnnotationType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAnnotationType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalAnnotationType& other) const; @@ -2949,22 +2485,6 @@ class CommonAliasBody return m_related_type; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonAliasBody::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonAliasBody& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonAliasBody::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonAliasBody::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonAliasBody& other) const; @@ -3063,22 +2583,6 @@ class CompleteAliasBody return m_ann_custom; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAliasBody::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteAliasBody& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAliasBody::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAliasBody::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteAliasBody& other) const; @@ -3132,22 +2636,6 @@ class MinimalAliasBody return m_common; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAliasBody::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalAliasBody& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAliasBody::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAliasBody::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalAliasBody& other) const; @@ -3199,22 +2687,6 @@ class CompleteAliasHeader return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAliasHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteAliasHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAliasHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAliasHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteAliasHeader& other) const; @@ -3244,22 +2716,6 @@ class MinimalAliasHeader RTPS_DllAPI MinimalAliasHeader& operator =( MinimalAliasHeader&& x); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAliasHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalAliasHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAliasHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAliasHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalAliasHeader&) const { @@ -3359,22 +2815,6 @@ class CompleteAliasType return m_body; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAliasType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteAliasType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAliasType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteAliasType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteAliasType& other) const; @@ -3473,22 +2913,6 @@ class MinimalAliasType return m_body; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAliasType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalAliasType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAliasType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalAliasType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalAliasType& other) const; @@ -3566,22 +2990,6 @@ class CompleteElementDetail return m_ann_custom; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteElementDetail::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteElementDetail& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteElementDetail::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteElementDetail::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteElementDetail& other) const; @@ -3657,22 +3065,6 @@ class CommonCollectionElement final return m_type; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonCollectionElement::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonCollectionElement& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonCollectionElement::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonCollectionElement::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonCollectionElement& other) const; @@ -3749,22 +3141,6 @@ class CompleteCollectionElement return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteCollectionElement::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteCollectionElement& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteCollectionElement::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteCollectionElement::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteCollectionElement& other) const; @@ -3818,22 +3194,6 @@ class MinimalCollectionElement return m_common; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalCollectionElement::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalCollectionElement& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalCollectionElement::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalCollectionElement::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalCollectionElement& other) const; @@ -3886,22 +3246,6 @@ class CommonCollectionHeader return m_bound; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonCollectionHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonCollectionHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonCollectionHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonCollectionHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonCollectionHeader& other) const; @@ -3977,22 +3321,6 @@ class CompleteCollectionHeader return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteCollectionHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteCollectionHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteCollectionHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteCollectionHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteCollectionHeader& other) const; @@ -4046,22 +3374,6 @@ class MinimalCollectionHeader return m_common; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalCollectionHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalCollectionHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalCollectionHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalCollectionHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalCollectionHeader& other) const; @@ -4161,22 +3473,6 @@ class CompleteSequenceType return m_element; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteSequenceType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteSequenceType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteSequenceType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteSequenceType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteSequenceType& other) const; @@ -4277,22 +3573,6 @@ class MinimalSequenceType return m_element; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalSequenceType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalSequenceType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalSequenceType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalSequenceType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalSequenceType& other) const; @@ -4348,22 +3628,6 @@ class CommonArrayHeader return m_bound_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonArrayHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonArrayHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonArrayHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonArrayHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonArrayHeader& other) const; @@ -4439,22 +3703,6 @@ class CompleteArrayHeader return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteArrayHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteArrayHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteArrayHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteArrayHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteArrayHeader& other) const; @@ -4508,22 +3756,6 @@ class MinimalArrayHeader return m_common; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalArrayHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalArrayHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalArrayHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalArrayHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalArrayHeader& other) const; @@ -4622,22 +3854,6 @@ class CompleteArrayType return m_element; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteArrayType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteArrayType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteArrayType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteArrayType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteArrayType& other) const; @@ -4738,22 +3954,6 @@ class MinimalArrayType return m_element; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalArrayType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalArrayType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalArrayType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalArrayType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalArrayType& other) const; @@ -4878,22 +4078,6 @@ class CompleteMapType final return m_element; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteMapType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteMapType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteMapType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteMapType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteMapType& other) const; @@ -5017,22 +4201,6 @@ class MinimalMapType final return m_element; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalMapType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalMapType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalMapType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalMapType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalMapType& other) const; @@ -5116,22 +4284,6 @@ class CommonEnumeratedLiteral return m_flags; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonEnumeratedLiteral::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonEnumeratedLiteral& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonEnumeratedLiteral::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonEnumeratedLiteral::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonEnumeratedLiteral& other) const; @@ -5210,22 +4362,6 @@ class CompleteEnumeratedLiteral return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteEnumeratedLiteral::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteEnumeratedLiteral& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteEnumeratedLiteral::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteEnumeratedLiteral::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteEnumeratedLiteral& other) const; @@ -5306,22 +4442,6 @@ class MinimalEnumeratedLiteral return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalEnumeratedLiteral::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalEnumeratedLiteral& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalEnumeratedLiteral::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalEnumeratedLiteral::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalEnumeratedLiteral& other) const; @@ -5378,22 +4498,6 @@ class CommonEnumeratedHeader final return m_bit_bound; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonEnumeratedHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonEnumeratedHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonEnumeratedHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonEnumeratedHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonEnumeratedHeader& other) const; @@ -5469,22 +4573,6 @@ class CompleteEnumeratedHeader return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteEnumeratedHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteEnumeratedHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteEnumeratedHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteEnumeratedHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteEnumeratedHeader& other) const; @@ -5538,22 +4626,6 @@ class MinimalEnumeratedHeader return m_common; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalEnumeratedHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalEnumeratedHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalEnumeratedHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalEnumeratedHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalEnumeratedHeader& other) const; @@ -5653,22 +4725,6 @@ class CompleteEnumeratedType return m_literal_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteEnumeratedType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteEnumeratedType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteEnumeratedType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteEnumeratedType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteEnumeratedType& other) const; @@ -5769,22 +4825,6 @@ class MinimalEnumeratedType return m_literal_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalEnumeratedType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalEnumeratedType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalEnumeratedType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalEnumeratedType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalEnumeratedType& other) const; @@ -5864,22 +4904,6 @@ class CommonBitflag final return m_flags; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonBitflag::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonBitflag& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonBitflag::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonBitflag::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonBitflag& other) const; @@ -5956,22 +4980,6 @@ class CompleteBitflag return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitflag::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteBitflag& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitflag::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitflag::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteBitflag& other) const; @@ -6049,22 +5057,6 @@ class MinimalBitflag return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitflag::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalBitflag& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitflag::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitflag::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalBitflag& other) const; @@ -6121,22 +5113,6 @@ class CommonBitmaskHeader final return m_bit_bound; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonBitmaskHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonBitmaskHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonBitmaskHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonBitmaskHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonBitmaskHeader& other) const; @@ -6237,22 +5213,6 @@ class CompleteBitmaskType return m_flag_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitmaskType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteBitmaskType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitmaskType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitmaskType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteBitmaskType& other) const; @@ -6353,22 +5313,6 @@ class MinimalBitmaskType return m_flag_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitmaskType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalBitmaskType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitmaskType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitmaskType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalBitmaskType& other) const; @@ -6493,22 +5437,6 @@ class CommonBitfield final return m_holder_type; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonBitfield::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CommonBitfield& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonBitfield::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CommonBitfield::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CommonBitfield& other) const; @@ -6587,22 +5515,6 @@ class CompleteBitfield return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitfield::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteBitfield& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitfield::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitfielddeserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteBitfield& other) const; @@ -6680,22 +5592,6 @@ class MinimalBitfield return m_common; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitfield::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalBitfield& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitfield::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitfield::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalBitfield& other) const; @@ -6772,22 +5668,6 @@ class CompleteBitsetHeader return m_detail; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitsetHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteBitsetHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitsetHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitsetHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteBitsetHeader& other) const; @@ -6841,22 +5721,6 @@ class MinimalBitsetHeader return m_base_type; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitsetHeader::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalBitsetHeader& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitsetHeader::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitsetHeader::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalBitsetHeader& other) const; @@ -6954,22 +5818,6 @@ class CompleteBitsetType return m_field_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitsetType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteBitsetType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitsetType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteBitsetType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteBitsetType& other) const; @@ -7070,22 +5918,6 @@ class MinimalBitsetType return m_field_seq; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitsetType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalBitsetType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitsetType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalBitsetType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalBitsetType& other) const; @@ -7122,22 +5954,6 @@ class CompleteExtendedType RTPS_DllAPI CompleteExtendedType& operator =( CompleteExtendedType&& x); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteExtendedType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteExtendedType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteExtendedType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteExtendedType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteExtendedType&) const { @@ -7170,22 +5986,6 @@ class MinimalExtendedType RTPS_DllAPI MinimalExtendedType& operator =( MinimalExtendedType&& x); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalExtendedType::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalExtendedType& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalExtendedType::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalExtendedType::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalExtendedType&) const { @@ -7274,22 +6074,6 @@ class CompleteTypeObject final RTPS_DllAPI const CompleteExtendedType& extended_type() const; RTPS_DllAPI CompleteExtendedType& extended_type(); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteTypeObject::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const CompleteTypeObject& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteTypeObject::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::CompleteTypeObject::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const CompleteTypeObject& other) const; @@ -7388,22 +6172,6 @@ class MinimalTypeObject final RTPS_DllAPI const MinimalExtendedType& extended_type() const; RTPS_DllAPI MinimalExtendedType& extended_type(); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalTypeObject::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const MinimalTypeObject& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalTypeObject::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::MinimalTypeObject::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const MinimalTypeObject& other) const; @@ -7544,37 +6312,6 @@ class TypeObject */ RTPS_DllAPI MinimalTypeObject& minimal(); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - /*! - * @brief This function returns the serialized size of a data depending on the buffer alignment. - * @param data Data which is calculated its serialized size. - * @param current_alignment Buffer alignment. - * @return Serialized size. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeObject::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const TypeObject& data, - size_t current_alignment = 0); - /*! - * @brief This function serializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeObject::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - /*! - * @brief This function deserializes an object using CDR serialization. - * @param cdr CDR serialization object. - */ - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeObject::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - RTPS_DllAPI bool operator ==( const TypeObject& other) const; @@ -7666,22 +6403,6 @@ class TypeIdentifierTypeObjectPair final return m_type_object; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifierTypeObjectPair::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const TypeIdentifierTypeObjectPair& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifierTypeObjectPair::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifierTypeObjectPair::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - private: TypeIdentifier m_type_identifier; @@ -7752,22 +6473,6 @@ class TypeIdentifierPair final return m_type_identifier2; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifierPair::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const TypeIdentifierPair& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifierPair::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifierPair::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - private: TypeIdentifier m_type_identifier1; @@ -7838,22 +6543,6 @@ class TypeIdentifierWithSize return m_typeobject_serialized_size; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifierWithSize::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const TypeIdentifierWithSize& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifierWithSize::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifierWithSize::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - private: TypeIdentifier m_type_id; @@ -7949,22 +6638,6 @@ class TypeIdentifierWithDependencies return m_dependent_typeids; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifierWithDependencies::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const TypeIdentifierWithDependencies& data, - size_t current_alignment = 0); - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifierWithDependencies::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeIdentifierWithDependencies::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - private: TypeIdentifierWithSize m_typeid_with_size; @@ -8041,24 +6714,6 @@ class TypeInformation return m_complete; } -#ifndef DOXYGEN_SHOULD_SKIP_THIS - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeInformation::getCdrSerializedSize()", - "In favor of version using eprosima::fastcdr::calculate_serialized_size.") - RTPS_DllAPI static size_t getCdrSerializedSize( - const TypeInformation& data, - size_t current_alignment = 0); - - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeInformation::serialize()", - "In favor of version using eprosima::fastcdr::serialize.") - RTPS_DllAPI void serialize( - eprosima::fastcdr::Cdr& cdr) const; - - FASTDDS_SER_METHOD_DEPRECATED(3, "eprosima::fastrtps::types::TypeInformation::deserialize()", - "In favor of version using eprosima::fastcdr::deserialize.") - RTPS_DllAPI void deserialize( - eprosima::fastcdr::Cdr& cdr); -#endif // DOXYGEN_SHOULD_SKIP_THIS - private: TypeIdentifierWithDependencies m_minimal; diff --git a/include/fastrtps/utils/IPFinder.h b/include/fastrtps/utils/IPFinder.h index c0ce5010975..116e87e57fd 100644 --- a/include/fastrtps/utils/IPFinder.h +++ b/include/fastrtps/utils/IPFinder.h @@ -20,12 +20,11 @@ #ifndef IPFINDER_H_ #define IPFINDER_H_ - - -#include #include +#include #include +#include #include namespace eprosima { diff --git a/include/fastrtps/utils/System.h b/include/fastrtps/utils/System.h deleted file mode 100644 index 8a9e86b56ec..00000000000 --- a/include/fastrtps/utils/System.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2018 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file System.h - * - */ - -#ifndef _EPROSIMA_SYSTEM_UTILS_H -#define _EPROSIMA_SYSTEM_UTILS_H - -#include "../fastrtps_dll.h" - -namespace eprosima { -namespace fastrtps { - -/** - * Class System, to provide helper functions to access system information. - * @ingroup UTILITIES_MODULE - */ -class System -{ -public: - - //! Returns current process identifier. - FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastrtps::System::GetPID", "") - RTPS_DllAPI static int GetPID(); -}; - -} /* namespace fastrtps */ -} /* namespace eprosima */ - -#endif /* _EPROSIMA_SYSTEM_UTILS_H */ diff --git a/include/fastrtps/utils/TimedConditionVariable.hpp b/include/fastrtps/utils/TimedConditionVariable.hpp index d2c4a795336..dbbb3e1267d 100644 --- a/include/fastrtps/utils/TimedConditionVariable.hpp +++ b/include/fastrtps/utils/TimedConditionVariable.hpp @@ -18,7 +18,8 @@ #ifndef _UTILS_TIMEDCONDITIONVARIABLE_HPP_ #define _UTILS_TIMEDCONDITIONVARIABLE_HPP_ -#include + +#include /* NOTE: Windows implementation temporary disabled due to aleatory high CPU consumption when diff --git a/include/fastrtps/utils/collections/foonathan_memory_helpers.hpp b/include/fastrtps/utils/collections/foonathan_memory_helpers.hpp deleted file mode 100644 index 24b963f8d57..00000000000 --- a/include/fastrtps/utils/collections/foonathan_memory_helpers.hpp +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2019 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file foonathan_memory_helpers.hpp - * - */ - -#ifndef FASTRTPS_UTILS_COLLECTIONS_FOONATHAN_MEMORY_HELPERS_HPP_ -#define FASTRTPS_UTILS_COLLECTIONS_FOONATHAN_MEMORY_HELPERS_HPP_ - -#include -#include - -#include "ResourceLimitedContainerConfig.hpp" -#include "fastrtps/config.h" - -namespace eprosima { -namespace fastrtps { - -/** - * A helper to calculate the block size of a memory pool given the size of the node and - * a resource limits configuration. - * - * @tparam MemoryPool memory_pool specialization - * - * @param node_size Size of the node for the memory pool - * @param limits Resource limits configuration of the container - * - * @return the block size to pass to the memory pool constructor - */ -template -std::size_t memory_pool_block_size( - std::size_t node_size, - const ResourceLimitedContainerConfig& limits) -{ - FASTDDS_DEPRECATED_UNTIL(3, "eprosima::fastrtps::memory_pool_block_size", "You should not use this method") - namespace fm = foonathan::memory; - - size_t num_elems = limits.increment > 0 ? limits.initial : limits.maximum; - if (num_elems < 1u) - { - num_elems = 1u; - } - - return num_elems - * ((node_size > MemoryPool::min_node_size ? node_size : MemoryPool::min_node_size) // Room for elements -#if FOONATHAN_MEMORY_DEBUG_DOUBLE_DEALLOC_CHECK - * (fm::detail::debug_fence_size ? 3 : 1)) // Room for debug info -#else - + (fm::detail::debug_fence_size ? 2 * fm::detail::max_alignment : 0)) // Room for debug info -#endif // if FOONATHAN_MEMORY_DEBUG_DOUBLE_DEALLOC_CHECK -#ifdef FOONATHAN_MEMORY_MEMORY_POOL_HAS_MIN_BLOCK_SIZE - + fm::detail::memory_block_stack::implementation_offset(); // Room for padding -#else - + fm::detail::memory_block_stack::implementation_offset; // Room for padding -#endif // FOONATHAN_MEMORY_MEMORY_POOL_HAS_MIN_BLOCK_SIZE -} - -} // namespace fastrtps -} // namespace eprosima - -#endif /* FASTRTPS_UTILS_COLLECTIONS_FOONATHAN_MEMORY_HELPERS_HPP_ */ diff --git a/include/fastrtps/utils/shared_mutex.hpp b/include/fastrtps/utils/shared_mutex.hpp index d6924144eb7..86e1be5efab 100644 --- a/include/fastrtps/utils/shared_mutex.hpp +++ b/include/fastrtps/utils/shared_mutex.hpp @@ -588,7 +588,7 @@ using std::swap; !(defined(HAVE_CXX17) && HAVE_CXX17) && __cplusplus < 201703 ) /* - Fast-DDS defaults to PTHREAD_RWLOCK_PREFER_READER_NP for two main reasons: + Fast DDS defaults to PTHREAD_RWLOCK_PREFER_READER_NP for two main reasons: - It allows reader side recursiveness. If we have two threads (T1, T2) and called S a shared lock and E and exclusive one. diff --git a/include/fastrtps/xmlparser/XMLParserCommon.h b/include/fastrtps/xmlparser/XMLParserCommon.h index 972c863dfef..d4a0450d3dc 100644 --- a/include/fastrtps/xmlparser/XMLParserCommon.h +++ b/include/fastrtps/xmlparser/XMLParserCommon.h @@ -31,8 +31,8 @@ enum class XMLP_ret }; -extern const char* DEFAULT_FASTRTPS_ENV_VARIABLE; -extern const char* DEFAULT_FASTRTPS_PROFILES; +extern const char* DEFAULT_FASTDDS_ENV_VARIABLE; +extern const char* DEFAULT_FASTDDS_PROFILES; extern const char* DEFAULT_STATISTICS_DATAWRITER_PROFILE; extern const char* SKIP_DEFAULT_XML_FILE; diff --git a/m4/ax_check_openssl.m4 b/m4/ax_check_openssl.m4 deleted file mode 100644 index 28e48cbefb6..00000000000 --- a/m4/ax_check_openssl.m4 +++ /dev/null @@ -1,124 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_check_openssl.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CHECK_OPENSSL([action-if-found[, action-if-not-found]]) -# -# DESCRIPTION -# -# Look for OpenSSL in a number of default spots, or in a user-selected -# spot (via --with-openssl). Sets -# -# OPENSSL_INCLUDES to the include directives required -# OPENSSL_LIBS to the -l directives required -# OPENSSL_LDFLAGS to the -L or -R flags required -# -# and calls ACTION-IF-FOUND or ACTION-IF-NOT-FOUND appropriately -# -# This macro sets OPENSSL_INCLUDES such that source files should use the -# openssl/ directory in include directives: -# -# #include -# -# LICENSE -# -# Copyright (c) 2009,2010 Zmanda Inc. -# Copyright (c) 2009,2010 Dustin J. Mitchell -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 10 - -AU_ALIAS([CHECK_SSL], [AX_CHECK_OPENSSL]) -AC_DEFUN([AX_CHECK_OPENSSL], [ - found=false - AC_ARG_WITH([openssl], - [AS_HELP_STRING([--with-openssl=DIR], - [root of the OpenSSL directory])], - [ - case "$withval" in - "" | y | ye | yes | n | no) - AC_MSG_ERROR([Invalid --with-openssl value]) - ;; - *) ssldirs="$withval" - ;; - esac - ], [ - # if pkg-config is installed and openssl has installed a .pc file, - # then use that information and don't search ssldirs - AC_CHECK_TOOL([PKG_CONFIG], [pkg-config]) - if test x"$PKG_CONFIG" != x""; then - OPENSSL_LDFLAGS=`$PKG_CONFIG openssl --libs-only-L 2>/dev/null` - if test $? = 0; then - OPENSSL_LIBS=`$PKG_CONFIG openssl --libs-only-l 2>/dev/null` - OPENSSL_INCLUDES=`$PKG_CONFIG openssl --cflags-only-I 2>/dev/null` - found=true - fi - fi - - # no such luck; use some default ssldirs - if ! $found; then - ssldirs="/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr" - fi - ] - ) - - - # note that we #include , so the OpenSSL headers have to be in - # an 'openssl' subdirectory - - if ! $found; then - OPENSSL_INCLUDES= - for ssldir in $ssldirs; do - AC_MSG_CHECKING([for openssl/ssl.h in $ssldir]) - if test -f "$ssldir/include/openssl/ssl.h"; then - OPENSSL_INCLUDES="-I$ssldir/include" - OPENSSL_LDFLAGS="-L$ssldir/lib" - OPENSSL_LIBS="-lssl -lcrypto" - found=true - AC_MSG_RESULT([yes]) - break - else - AC_MSG_RESULT([no]) - fi - done - - # if the file wasn't found, well, go ahead and try the link anyway -- maybe - # it will just work! - fi - - # try the preprocessor and linker with our new flags, - # being careful not to pollute the global LIBS, LDFLAGS, and CPPFLAGS - - AC_MSG_CHECKING([whether compiling and linking against OpenSSL works]) - echo "Trying link with OPENSSL_LDFLAGS=$OPENSSL_LDFLAGS;" \ - "OPENSSL_LIBS=$OPENSSL_LIBS; OPENSSL_INCLUDES=$OPENSSL_INCLUDES" >&AS_MESSAGE_LOG_FD - - save_LIBS="$LIBS" - save_LDFLAGS="$LDFLAGS" - save_CPPFLAGS="$CPPFLAGS" - LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS" - LIBS="$OPENSSL_LIBS $LIBS" - CPPFLAGS="$OPENSSL_INCLUDES $CPPFLAGS" - AC_LINK_IFELSE( - [AC_LANG_PROGRAM([#include ], [SSL_new(NULL)])], - [ - AC_MSG_RESULT([yes]) - $1 - ], [ - AC_MSG_RESULT([no]) - $2 - ]) - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - - AC_SUBST([OPENSSL_INCLUDES]) - AC_SUBST([OPENSSL_LIBS]) - AC_SUBST([OPENSSL_LDFLAGS]) -]) diff --git a/m4/ax_cxx_compile_stdcxx_0x.m4 b/m4/ax_cxx_compile_stdcxx_0x.m4 deleted file mode 100644 index 719f92c62cf..00000000000 --- a/m4/ax_cxx_compile_stdcxx_0x.m4 +++ /dev/null @@ -1,109 +0,0 @@ -# ============================================================================ -# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_0x.html -# ============================================================================ -# -# SYNOPSIS -# -# AX_CXX_COMPILE_STDCXX_0X -# -# DESCRIPTION -# -# Check for baseline language coverage in the compiler for the C++0x -# standard. -# -# LICENSE -# -# Copyright (c) 2008 Benjamin Kosnik -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 8 - -AU_ALIAS([AC_CXX_COMPILE_STDCXX_0X], [AX_CXX_COMPILE_STDCXX_0X]) -AC_DEFUN([AX_CXX_COMPILE_STDCXX_0X], [ - AC_CACHE_CHECK(if g++ supports C++0x features without additional flags, - ax_cv_cxx_compile_cxx0x_native, - [AC_LANG_SAVE - AC_LANG_CPLUSPLUS - AC_TRY_COMPILE([ - template - struct check - { - static_assert(sizeof(int) <= sizeof(T), "not big enough"); - }; - - typedef check> right_angle_brackets; - - int a; - decltype(a) b; - - typedef check check_type; - check_type c; - check_type&& cr = static_cast(c);],, - ax_cv_cxx_compile_cxx0x_native=yes, ax_cv_cxx_compile_cxx0x_native=no) - AC_LANG_RESTORE - ]) - - AC_CACHE_CHECK(if g++ supports C++0x features with -std=c++0x, - ax_cv_cxx_compile_cxx0x_cxx, - [AC_LANG_SAVE - AC_LANG_CPLUSPLUS - ac_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS -std=c++0x" - AC_TRY_COMPILE([ - template - struct check - { - static_assert(sizeof(int) <= sizeof(T), "not big enough"); - }; - - typedef check> right_angle_brackets; - - int a; - decltype(a) b; - - typedef check check_type; - check_type c; - check_type&& cr = static_cast(c);],, - ax_cv_cxx_compile_cxx0x_cxx=yes, ax_cv_cxx_compile_cxx0x_cxx=no) - CXXFLAGS="$ac_save_CXXFLAGS" - AC_LANG_RESTORE - ]) - - AC_CACHE_CHECK(if g++ supports C++0x features with -std=gnu++0x, - ax_cv_cxx_compile_cxx0x_gxx, - [AC_LANG_SAVE - AC_LANG_CPLUSPLUS - ac_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS -std=gnu++0x" - AC_TRY_COMPILE([ - template - struct check - { - static_assert(sizeof(int) <= sizeof(T), "not big enough"); - }; - - typedef check> right_angle_brackets; - - int a; - decltype(a) b; - - typedef check check_type; - check_type c; - check_type&& cr = static_cast(c);],, - ax_cv_cxx_compile_cxx0x_gxx=yes, ax_cv_cxx_compile_cxx0x_gxx=no) - CXXFLAGS="$ac_save_CXXFLAGS" - AC_LANG_RESTORE - ]) - - if test "$ax_cv_cxx_compile_cxx0x_native" = yes || - test "$ax_cv_cxx_compile_cxx0x_cxx" = yes || - test "$ax_cv_cxx_compile_cxx0x_gxx" = yes; then - AC_DEFINE(HAVE_CXX0X, 1,[Define if g++ supports C++0x features. ]) - else - AC_DEFINE(HAVE_CXX0X, 0,[Define if g++ supports C++0x features. ]) - fi -]) diff --git a/m4/ax_cxx_compile_stdcxx_11.m4 b/m4/ax_cxx_compile_stdcxx_11.m4 deleted file mode 100644 index 395b13d2a6d..00000000000 --- a/m4/ax_cxx_compile_stdcxx_11.m4 +++ /dev/null @@ -1,167 +0,0 @@ -# ============================================================================ -# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html -# ============================================================================ -# -# SYNOPSIS -# -# AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional]) -# -# DESCRIPTION -# -# Check for baseline language coverage in the compiler for the C++11 -# standard; if necessary, add switches to CXXFLAGS to enable support. -# -# The first argument, if specified, indicates whether you insist on an -# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. -# -std=c++11). If neither is specified, you get whatever works, with -# preference for an extended mode. -# -# The second argument, if specified 'mandatory' or if left unspecified, -# indicates that baseline C++11 support is required and that the macro -# should error out if no mode with that support is found. If specified -# 'optional', then configuration proceeds regardless, after defining -# HAVE_CXX11 if and only if a supporting mode is found. -# -# LICENSE -# -# Copyright (c) 2008 Benjamin Kosnik -# Copyright (c) 2012 Zack Weinberg -# Copyright (c) 2013 Roy Stogner -# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 11 - -m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[ - template - struct check - { - static_assert(sizeof(int) <= sizeof(T), "not big enough"); - }; - - struct Base { - virtual void f() {} - }; - struct Child : public Base { - virtual void f() override {} - }; - - typedef check> right_angle_brackets; - - int a; - decltype(a) b; - - typedef check check_type; - check_type c; - check_type&& cr = static_cast(c); - - auto d = a; - auto l = [](){}; - // Prevent Clang error: unused variable 'l' [-Werror,-Wunused-variable] - struct use_l { use_l() { l(); } }; - - // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae - // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function because of this - namespace test_template_alias_sfinae { - struct foo {}; - - template - using member = typename T::member_type; - - template - void func(...) {} - - template - void func(member*) {} - - void test(); - - void test() { - func(0); - } - } -]]) - -AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl - m4_if([$1], [], [], - [$1], [ext], [], - [$1], [noext], [], - [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl - m4_if([$2], [], [ax_cxx_compile_cxx11_required=true], - [$2], [mandatory], [ax_cxx_compile_cxx11_required=true], - [$2], [optional], [ax_cxx_compile_cxx11_required=false], - [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])]) - AC_LANG_PUSH([C++])dnl - ac_success=no - AC_CACHE_CHECK(whether $CXX supports C++11 features by default, - ax_cv_cxx_compile_cxx11, - [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], - [ax_cv_cxx_compile_cxx11=yes], - [ax_cv_cxx_compile_cxx11=no])]) - if test x$ax_cv_cxx_compile_cxx11 = xyes; then - ac_success=yes - fi - - m4_if([$1], [noext], [], [dnl - if test x$ac_success = xno; then - for switch in -std=gnu++11 -std=gnu++0x; do - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) - AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, - $cachevar, - [ac_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS $switch" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], - [eval $cachevar=yes], - [eval $cachevar=no]) - CXXFLAGS="$ac_save_CXXFLAGS"]) - if eval test x\$$cachevar = xyes; then - CXXFLAGS="$CXXFLAGS $switch" - ac_success=yes - break - fi - done - fi]) - - m4_if([$1], [ext], [], [dnl - if test x$ac_success = xno; then - dnl HP's aCC needs +std=c++11 according to: - dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf - for switch in -std=c++11 -std=c++0x +std=c++11; do - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) - AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, - $cachevar, - [ac_save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS $switch" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], - [eval $cachevar=yes], - [eval $cachevar=no]) - CXXFLAGS="$ac_save_CXXFLAGS"]) - if eval test x\$$cachevar = xyes; then - CXXFLAGS="$CXXFLAGS $switch" - ac_success=yes - break - fi - done - fi]) - AC_LANG_POP([C++]) - if test x$ax_cxx_compile_cxx11_required = xtrue; then - if test x$ac_success = xno; then - AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) - fi - else - if test x$ac_success = xno; then - HAVE_CXX11=0 - AC_MSG_NOTICE([No compiler with C++11 support was found]) - else - HAVE_CXX11=1 - AC_DEFINE(HAVE_CXX11,1, - [define if the compiler supports basic C++11 syntax]) - fi - - AC_SUBST(HAVE_CXX11) - fi -]) diff --git a/package.xml b/package.xml index 138d7d371ec..c5d39b49c0c 100644 --- a/package.xml +++ b/package.xml @@ -1,10 +1,10 @@ - fastrtps - 2.14.1 + fastdds + 3.0.0 - *eprosima Fast DDS* (formerly Fast RTPS) is a C++ implementation of the DDS (Data Distribution Service) standard of the OMG (Object Management Group). eProsima Fast DDS implements the RTPS (Real Time Publish Subscribe) protocol, which provides publisher-subscriber communications over unreliable transports such as UDP, as defined and maintained by the Object Management Group (OMG) consortium. RTPS is also the wire interoperability protocol defined for the Data Distribution Service (DDS) standard. *eProsima Fast DDS* expose an API to access directly the RTPS protocol, giving the user full access to the protocol internals. + *eprosima Fast DDS* is a C++ implementation of the DDS (Data Distribution Service) standard of the OMG (Object Management Group). eProsima Fast DDS implements the RTPS (Real Time Publish Subscribe) protocol, which provides publisher-subscriber communications over unreliable transports such as UDP, as defined and maintained by the Object Management Group (OMG) consortium. RTPS is also the wire interoperability protocol defined for the Data Distribution Service (DDS) standard. *eProsima Fast DDS* expose an API to access directly the RTPS protocol, giving the user full access to the protocol internals. Miguel Company Eduardo Ponz diff --git a/doc/images/fastdds_github_banner.png b/resources/images/fastdds_github_banner.png similarity index 100% rename from doc/images/fastdds_github_banner.png rename to resources/images/fastdds_github_banner.png diff --git a/utils/images/logo/eProsimaLogo.jpg b/resources/images/logo/eProsimaLogo.jpg similarity index 100% rename from utils/images/logo/eProsimaLogo.jpg rename to resources/images/logo/eProsimaLogo.jpg diff --git a/utils/images/logo/eProsimaLogo.png b/resources/images/logo/eProsimaLogo.png similarity index 100% rename from utils/images/logo/eProsimaLogo.png rename to resources/images/logo/eProsimaLogo.png diff --git a/resources/xsd/fastRTPS_profiles.xsd b/resources/xsd/fastdds_profiles.xsd similarity index 99% rename from resources/xsd/fastRTPS_profiles.xsd rename to resources/xsd/fastdds_profiles.xsd index 17f28870206..9c355ab7366 100644 --- a/resources/xsd/fastRTPS_profiles.xsd +++ b/resources/xsd/fastdds_profiles.xsd @@ -1,7 +1,7 @@ diff --git a/src/cpp/CMakeLists.txt b/src/cpp/CMakeLists.txt index bac5fec9875..4d800efce86 100644 --- a/src/cpp/CMakeLists.txt +++ b/src/cpp/CMakeLists.txt @@ -36,43 +36,133 @@ set(${PROJECT_NAME}_source_files ${DDSSQLFILTER_SOURCES} + dynamic-types/AnnotationDescriptor.cpp + dynamic-types/AnnotationParameterValue.cpp + dynamic-types/BuiltinAnnotationsTypeObject.cpp + dynamic-types/DynamicData.cpp + dynamic-types/DynamicDataFactory.cpp + dynamic-types/DynamicDataHelper.cpp + dynamic-types/DynamicDataPtr.cpp + dynamic-types/DynamicPubSubType.cpp + dynamic-types/DynamicType.cpp + dynamic-types/DynamicTypeBuilder.cpp + dynamic-types/DynamicTypeBuilderFactory.cpp + dynamic-types/DynamicTypeBuilderPtr.cpp + dynamic-types/DynamicTypeMember.cpp + dynamic-types/DynamicTypePtr.cpp + dynamic-types/MemberDescriptor.cpp + dynamic-types/TypeDescriptor.cpp + dynamic-types/TypeIdentifier.cpp + dynamic-types/TypeIdentifierTypes.cpp + dynamic-types/TypeNamesGenerator.cpp + dynamic-types/TypeObject.cpp + dynamic-types/TypeObjectFactory.cpp + dynamic-types/TypeObjectHashId.cpp + dynamic-types/TypesBase.cpp + fastdds/builtin/typelookup/common/TypeLookupTypes.cpp + fastdds/builtin/typelookup/TypeLookupManager.cpp + fastdds/builtin/typelookup/TypeLookupReplyListener.cpp + fastdds/builtin/typelookup/TypeLookupRequestListener.cpp + fastdds/core/condition/Condition.cpp + fastdds/core/condition/ConditionNotifier.cpp + fastdds/core/condition/GuardCondition.cpp + fastdds/core/condition/StatusCondition.cpp + fastdds/core/condition/StatusConditionImpl.cpp + fastdds/core/condition/WaitSet.cpp + fastdds/core/condition/WaitSetImpl.cpp + fastdds/core/Entity.cpp + fastdds/core/policy/ParameterList.cpp + fastdds/core/policy/QosPolicyUtils.cpp + fastdds/domain/DomainParticipant.cpp + fastdds/domain/DomainParticipantFactory.cpp + fastdds/domain/DomainParticipantImpl.cpp + fastdds/domain/qos/DomainParticipantFactoryQos.cpp + fastdds/domain/qos/DomainParticipantQos.cpp + fastdds/log/FileConsumer.cpp fastdds/log/Log.cpp fastdds/log/OStreamConsumer.cpp - fastdds/log/StdoutErrConsumer.cpp fastdds/log/StdoutConsumer.cpp - fastdds/log/FileConsumer.cpp - + fastdds/log/StdoutErrConsumer.cpp + fastdds/publisher/DataWriter.cpp + fastdds/publisher/DataWriterHistory.cpp + fastdds/publisher/DataWriterImpl.cpp + fastdds/publisher/Publisher.cpp + fastdds/publisher/PublisherImpl.cpp + fastdds/publisher/qos/DataWriterQos.cpp + fastdds/publisher/qos/PublisherQos.cpp + fastdds/publisher/qos/WriterQos.cpp + fastdds/subscriber/DataReader.cpp + fastdds/subscriber/DataReaderImpl.cpp + fastdds/subscriber/history/DataReaderHistory.cpp + fastdds/subscriber/qos/DataReaderQos.cpp + fastdds/subscriber/qos/ReaderQos.cpp + fastdds/subscriber/qos/SubscriberQos.cpp + fastdds/subscriber/ReadCondition.cpp + fastdds/subscriber/Subscriber.cpp + fastdds/subscriber/SubscriberImpl.cpp + fastdds/topic/ContentFilteredTopic.cpp + fastdds/topic/ContentFilteredTopicImpl.cpp + fastdds/topic/qos/TopicQos.cpp + fastdds/topic/Topic.cpp + fastdds/topic/TopicDataType.cpp + fastdds/topic/TopicImpl.cpp + fastdds/topic/TopicProxyFactory.cpp + fastdds/topic/TypeSupport.cpp + fastdds/utils/QosConverters.cpp + rtps/attributes/PropertyPolicy.cpp + rtps/attributes/RTPSParticipantAttributes.cpp + rtps/attributes/ThreadSettings.cpp + rtps/attributes/TopicAttributes.cpp + rtps/builtin/BuiltinProtocols.cpp + rtps/builtin/data/ParticipantProxyData.cpp + rtps/builtin/data/ReaderProxyData.cpp + rtps/builtin/data/WriterProxyData.cpp + rtps/builtin/discovery/database/backup/SharedBackupFunctions.cpp + rtps/builtin/discovery/database/DiscoveryDataBase.cpp + rtps/builtin/discovery/database/DiscoveryParticipantInfo.cpp + rtps/builtin/discovery/database/DiscoveryParticipantsAckStatus.cpp + rtps/builtin/discovery/database/DiscoverySharedInfo.cpp + rtps/builtin/discovery/endpoint/EDP.cpp + rtps/builtin/discovery/endpoint/EDPClient.cpp + rtps/builtin/discovery/endpoint/EDPServer.cpp + rtps/builtin/discovery/endpoint/EDPServerListeners.cpp + rtps/builtin/discovery/endpoint/EDPSimple.cpp + rtps/builtin/discovery/endpoint/EDPSimpleListeners.cpp + rtps/builtin/discovery/endpoint/EDPStatic.cpp + rtps/builtin/discovery/participant/DirectMessageSender.cpp + rtps/builtin/discovery/participant/PDP.cpp + rtps/builtin/discovery/participant/PDPClient.cpp + rtps/builtin/discovery/participant/PDPListener.cpp + rtps/builtin/discovery/participant/PDPServer.cpp + rtps/builtin/discovery/participant/PDPServerListener.cpp + rtps/builtin/discovery/participant/PDPSimple.cpp + rtps/builtin/discovery/participant/ServerAttributes.cpp + rtps/builtin/discovery/participant/timedevent/DSClientEvent.cpp + rtps/builtin/discovery/participant/timedevent/DServerEvent.cpp + rtps/builtin/liveliness/WLP.cpp + rtps/builtin/liveliness/WLPListener.cpp rtps/common/GuidPrefix_t.cpp rtps/common/LocatorWithMask.cpp rtps/common/Time_t.cpp - rtps/resources/ResourceEvent.cpp - rtps/resources/TimedEvent.cpp - rtps/resources/TimedEventImpl.cpp - rtps/writer/LivelinessManager.cpp - rtps/writer/LocatorSelectorSender.cpp - rtps/writer/RTPSWriter.cpp - rtps/writer/StatefulWriter.cpp - rtps/writer/ReaderProxy.cpp - rtps/writer/StatelessWriter.cpp - rtps/writer/ReaderLocator.cpp + rtps/common/Token.cpp + rtps/DataSharing/DataSharingListener.cpp + rtps/DataSharing/DataSharingNotification.cpp + rtps/DataSharing/DataSharingPayloadPool.cpp + rtps/exceptions/Exception.cpp + rtps/flowcontrol/FlowControllerConsts.cpp + rtps/flowcontrol/FlowControllerFactory.cpp + rtps/flowcontrol/ThroughputControllerDescriptor.cpp rtps/history/CacheChangePool.cpp rtps/history/History.cpp - rtps/history/WriterHistory.cpp rtps/history/ReaderHistory.cpp rtps/history/TopicPayloadPool.cpp rtps/history/TopicPayloadPoolRegistry.cpp - rtps/DataSharing/DataSharingPayloadPool.cpp - rtps/DataSharing/DataSharingListener.cpp - rtps/DataSharing/DataSharingNotification.cpp - rtps/reader/WriterProxy.cpp - rtps/reader/StatefulReader.cpp - rtps/reader/StatelessReader.cpp - rtps/reader/RTPSReader.cpp + rtps/history/WriterHistory.cpp + rtps/messages/MessageReceiver.cpp + rtps/messages/RTPSGapBuilder.cpp rtps/messages/RTPSMessageCreator.cpp rtps/messages/RTPSMessageGroup.cpp - rtps/messages/RTPSGapBuilder.cpp rtps/messages/SendBuffersManager.cpp - rtps/messages/MessageReceiver.cpp rtps/messages/submessages/AckNackMsg.hpp rtps/messages/submessages/DataMsg.hpp rtps/messages/submessages/GapMsg.hpp @@ -82,53 +172,19 @@ set(${PROJECT_NAME}_source_files rtps/network/utils/external_locators.cpp rtps/network/utils/netmask_filter.cpp rtps/network/utils/network.cpp - rtps/attributes/RTPSParticipantAttributes.cpp rtps/participant/RTPSParticipant.cpp rtps/participant/RTPSParticipantImpl.cpp + rtps/persistence/PersistenceFactory.cpp + rtps/reader/RTPSReader.cpp + rtps/reader/StatefulPersistentReader.cpp + rtps/reader/StatefulReader.cpp + rtps/reader/StatelessPersistentReader.cpp + rtps/reader/StatelessReader.cpp + rtps/reader/WriterProxy.cpp + rtps/resources/ResourceEvent.cpp + rtps/resources/TimedEvent.cpp + rtps/resources/TimedEventImpl.cpp rtps/RTPSDomain.cpp - fastrtps_deprecated/Domain.cpp - fastrtps_deprecated/participant/Participant.cpp - fastrtps_deprecated/participant/ParticipantImpl.cpp - fastrtps_deprecated/publisher/Publisher.cpp - fastrtps_deprecated/publisher/PublisherImpl.cpp - fastrtps_deprecated/publisher/PublisherHistory.cpp - fastrtps_deprecated/subscriber/Subscriber.cpp - fastrtps_deprecated/subscriber/SubscriberImpl.cpp - fastrtps_deprecated/subscriber/SubscriberHistory.cpp - fastdds/publisher/DataWriter.cpp - fastdds/publisher/DataWriterImpl.cpp - fastdds/publisher/DataWriterHistory.cpp - fastdds/topic/ContentFilteredTopic.cpp - fastdds/topic/ContentFilteredTopicImpl.cpp - fastdds/topic/Topic.cpp - fastdds/topic/TopicImpl.cpp - fastdds/topic/TopicProxyFactory.cpp - fastdds/topic/TypeSupport.cpp - fastdds/topic/TopicDataType.cpp - fastdds/topic/qos/TopicQos.cpp - fastdds/publisher/qos/DataWriterQos.cpp - fastdds/subscriber/qos/DataReaderQos.cpp - fastdds/publisher/PublisherImpl.cpp - fastdds/publisher/qos/PublisherQos.cpp - fastdds/publisher/Publisher.cpp - fastdds/subscriber/SubscriberImpl.cpp - fastdds/subscriber/qos/SubscriberQos.cpp - fastdds/subscriber/Subscriber.cpp - fastdds/subscriber/DataReader.cpp - fastdds/subscriber/DataReaderImpl.cpp - fastdds/subscriber/ReadCondition.cpp - fastdds/subscriber/history/DataReaderHistory.cpp - fastdds/domain/DomainParticipantFactory.cpp - fastdds/domain/DomainParticipantImpl.cpp - fastdds/domain/DomainParticipant.cpp - fastdds/domain/qos/DomainParticipantQos.cpp - fastdds/domain/qos/DomainParticipantFactoryQos.cpp - fastdds/builtin/typelookup/common/TypeLookupTypes.cpp - fastdds/builtin/common/RPCHeadersImpl.cpp - fastdds/builtin/typelookup/TypeLookupManager.cpp - fastdds/builtin/typelookup/TypeLookupRequestListener.cpp - fastdds/builtin/typelookup/TypeLookupReplyListener.cpp - rtps/transport/TransportInterface.cpp rtps/transport/ChainingTransport.cpp rtps/transport/ChannelResource.cpp rtps/transport/network/NetmaskFilterKind.cpp @@ -146,121 +202,38 @@ set(${PROJECT_NAME}_source_files rtps/transport/TCPv4Transport.cpp rtps/transport/TCPv6Transport.cpp rtps/transport/test_UDPv4Transport.cpp + rtps/transport/TransportInterface.cpp rtps/transport/UDPChannelResource.cpp rtps/transport/UDPTransportInterface.cpp rtps/transport/UDPv4Transport.cpp rtps/transport/UDPv6Transport.cpp - - dynamic-types/AnnotationDescriptor.cpp - dynamic-types/AnnotationParameterValue.cpp - dynamic-types/DynamicData.cpp - dynamic-types/DynamicDataFactory.cpp - dynamic-types/DynamicType.cpp - dynamic-types/DynamicPubSubType.cpp - dynamic-types/DynamicTypePtr.cpp - dynamic-types/DynamicDataPtr.cpp - dynamic-types/DynamicTypeBuilder.cpp - dynamic-types/DynamicTypeBuilderPtr.cpp - dynamic-types/DynamicTypeBuilderFactory.cpp - dynamic-types/DynamicTypeMember.cpp - dynamic-types/MemberDescriptor.cpp - dynamic-types/TypeDescriptor.cpp - dynamic-types/TypeIdentifier.cpp - dynamic-types/TypeIdentifierTypes.cpp - dynamic-types/TypeObject.cpp - dynamic-types/TypeObjectHashId.cpp - dynamic-types/TypeObjectFactory.cpp - dynamic-types/TypeNamesGenerator.cpp - dynamic-types/TypesBase.cpp - dynamic-types/BuiltinAnnotationsTypeObject.cpp - dynamic-types/DynamicDataHelper.cpp - - fastrtps_deprecated/attributes/TopicAttributes.cpp - fastdds/core/Entity.cpp - fastdds/core/condition/Condition.cpp - fastdds/core/condition/ConditionNotifier.cpp - fastdds/core/condition/GuardCondition.cpp - fastdds/core/condition/StatusCondition.cpp - fastdds/core/condition/StatusConditionImpl.cpp - fastdds/core/condition/WaitSet.cpp - fastdds/core/condition/WaitSetImpl.cpp - fastdds/core/policy/ParameterList.cpp - fastdds/core/policy/QosPolicyUtils.cpp - fastdds/publisher/qos/WriterQos.cpp - fastdds/subscriber/qos/ReaderQos.cpp - fastdds/utils/QosConverters.cpp - rtps/builtin/BuiltinProtocols.cpp - rtps/builtin/discovery/participant/DirectMessageSender.cpp - rtps/builtin/discovery/participant/PDP.cpp - rtps/builtin/discovery/participant/ServerAttributes.cpp - rtps/builtin/discovery/participant/PDPSimple.cpp - rtps/builtin/discovery/participant/PDPListener.cpp - rtps/builtin/discovery/endpoint/EDP.cpp - rtps/builtin/discovery/endpoint/EDPSimple.cpp - rtps/builtin/discovery/endpoint/EDPSimpleListeners.cpp - rtps/builtin/discovery/endpoint/EDPStatic.cpp - rtps/builtin/liveliness/WLP.cpp - rtps/builtin/liveliness/WLPListener.cpp - rtps/builtin/data/ParticipantProxyData.cpp - rtps/builtin/data/WriterProxyData.cpp - rtps/builtin/data/ReaderProxyData.cpp - rtps/flowcontrol/ThroughputControllerDescriptor.cpp - rtps/flowcontrol/FlowControllerConsts.cpp - rtps/flowcontrol/FlowControllerFactory.cpp - rtps/exceptions/Exception.cpp - rtps/attributes/PropertyPolicy.cpp - rtps/attributes/ThreadSettings.cpp - rtps/common/Token.cpp - rtps/xmlparser/XMLParserCommon.cpp - rtps/xmlparser/XMLElementParser.cpp + rtps/writer/LivelinessManager.cpp + rtps/writer/LocatorSelectorSender.cpp + rtps/writer/PersistentWriter.cpp + rtps/writer/ReaderLocator.cpp + rtps/writer/ReaderProxy.cpp + rtps/writer/RTPSWriter.cpp + rtps/writer/StatefulPersistentWriter.cpp + rtps/writer/StatefulWriter.cpp + rtps/writer/StatelessPersistentWriter.cpp + rtps/writer/StatelessWriter.cpp rtps/xmlparser/XMLDynamicParser.cpp + rtps/xmlparser/XMLElementParser.cpp rtps/xmlparser/XMLEndpointParser.cpp rtps/xmlparser/XMLParser.cpp + rtps/xmlparser/XMLParserCommon.cpp rtps/xmlparser/XMLProfileManager.cpp - rtps/writer/PersistentWriter.cpp - rtps/writer/StatelessPersistentWriter.cpp - rtps/writer/StatefulPersistentWriter.cpp - rtps/reader/StatelessPersistentReader.cpp - rtps/reader/StatefulPersistentReader.cpp - rtps/persistence/PersistenceFactory.cpp - - rtps/builtin/discovery/database/backup/SharedBackupFunctions.cpp - rtps/builtin/discovery/endpoint/EDPClient.cpp - rtps/builtin/discovery/endpoint/EDPServer.cpp - rtps/builtin/discovery/endpoint/EDPServerListeners.cpp - rtps/builtin/discovery/database/DiscoveryDataBase.cpp - rtps/builtin/discovery/database/DiscoveryParticipantInfo.cpp - rtps/builtin/discovery/database/DiscoveryParticipantsAckStatus.cpp - rtps/builtin/discovery/database/DiscoverySharedInfo.cpp - rtps/builtin/discovery/participant/PDPClient.cpp - rtps/builtin/discovery/participant/PDPServer.cpp - rtps/builtin/discovery/participant/PDPServerListener.cpp - rtps/builtin/discovery/participant/timedevent/DSClientEvent.cpp - rtps/builtin/discovery/participant/timedevent/DServerEvent.cpp - + statistics/fastdds/domain/DomainParticipant.cpp + statistics/fastdds/publisher/qos/DataWriterQos.cpp + statistics/fastdds/subscriber/qos/DataReaderQos.cpp utils/IPFinder.cpp + utils/IPLocator.cpp utils/md5.cpp + utils/string_convert.cpp utils/StringMatching.cpp - utils/IPLocator.cpp - utils/System.cpp utils/SystemInfo.cpp utils/TimedConditionVariable.cpp - utils/string_convert.cpp utils/UnitsParser.cpp - - dds/core/types.cpp - dds/core/Exception.cpp - dds/domain/DomainParticipant.cpp - dds/pub/Publisher.cpp - dds/pub/AnyDataWriter.cpp - dds/pub/DataWriter.cpp - dds/sub/Subscriber.cpp - dds/sub/DataReader.cpp - dds/topic/Topic.cpp - - statistics/fastdds/domain/DomainParticipant.cpp - statistics/fastdds/publisher/qos/DataWriterQos.cpp - statistics/fastdds/subscriber/qos/DataReaderQos.cpp ) # Statistics support @@ -524,14 +497,14 @@ if(MSVC OR MSVC_IDE) # On installed binaries use manifest to specify dependencies if(INSTALLER_PLATFORM AND OPENSSL_FOUND) - # Get Fast-DDS version suitable manifest format - set(FASTDDS_CANONICAL_VERSION ${fastrtps_VERSION}) + # Get Fast DDS version suitable manifest format + set(FASTDDS_CANONICAL_VERSION ${fastdds_VERSION}) if( NOT FASTDDS_CANONICAL_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+$") - message(FATAL_ERROR "Fast-DDS version number ${fastrtps_VERSION} must include major, minor and patch.") + message(FATAL_ERROR "Fast DDS version number ${fastdds_VERSION} must include major, minor and patch.") endif() - if( NOT fastrtps_VERSION_TWEAK) + if( NOT fastdds_VERSION_TWEAK) set(FASTDDS_CANONICAL_VERSION "${FASTDDS_CANONICAL_VERSION}.0") endif() @@ -588,7 +561,7 @@ if(MSVC OR MSVC_IDE) set_target_properties(${PROJECT_NAME} PROPERTIES VS_WINRT_COMPONENT "true") endif() elseif(BUILD_SHARED_LIBS) - set(VERSION_SCRIPT_SUPPORT_FLAGS -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libfastrtps.version) + set(VERSION_SCRIPT_SUPPORT_FLAGS -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libfastdds.version) set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} ${VERSION_SCRIPT_SUPPORT_FLAGS}) CHECK_CXX_SOURCE_COMPILES("int main(int, char**){return 0;}" HAS_VERSION_SCRIPT_SUPPORT) @@ -615,7 +588,7 @@ install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/${PROJECT_NAME} PATTERN "*.ipp" ) -install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/fastdds +install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/fastrtps DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT headers FILES_MATCHING @@ -699,9 +672,9 @@ endif() include(CMakePackageConfigHelpers) if(BUILD_SHARED_LIBS) - set(FASTRTPS_PACKAGE_OPT_BIN_DIR_CONDITION "if(MSVC OR MSVC_IDE)") + set(FASTDDS_PACKAGE_OPT_BIN_DIR_CONDITION "if(MSVC OR MSVC_IDE)") else() - set(FASTRTPS_PACKAGE_OPT_BIN_DIR_CONDITION "if(0)") + set(FASTDDS_PACKAGE_OPT_BIN_DIR_CONDITION "if(0)") endif() # include the option parser targets @@ -712,32 +685,32 @@ if(COMPILE_TOOLS) set(INCLUDE_FASTDDS_TARGETS "${INCLUDE_FASTDDS_TARGETS}\ninclude(\${CMAKE_CURRENT_LIST_DIR}/fast-discovery-server-targets.cmake)") endif() -# Add fastrtps dependencies in its CMake config file. +# Add fastdds dependencies in its CMake config file. if(LINK_SSL) if(INSTALLER_PLATFORM) # OpenSSL dependency is only propagated on static linking # We must use the deployed OpenSSL binaries to prevent compatibility issues - set(FASTRTPS_INSTALLER_DEPS_ANCILLARY "\ + set(FASTDDS_INSTALLER_DEPS_ANCILLARY "\ function(find_fastdds_deployed_openssl)\n\ if(OPENSSL_FOUND AND NOT(OPENSSL_VERSION STREQUAL \"${OPENSSL_VERSION}\") )\n\ - message(WARNING \"OpenSSL already loaded. Version \${OPENSSL_VERSION} differs from version ${OPENSSL_VERSION}, used in Fast-DDS binaries building, ABI issues may arise\")\n\ + message(WARNING \"OpenSSL already loaded. Version \${OPENSSL_VERSION} differs from version ${OPENSSL_VERSION}, used in Fast DDS binaries building, ABI issues may arise\")\n\ endif()\n\ set(OPENSSL_USE_STATIC_LIBS TRUE)\n\ set(OPENSSL_ROOT_DIR \"\${PACKAGE_PREFIX_DIR}/lib/${INSTALLER_PLATFORM}\")\n\ find_package(OpenSSL REQUIRED)\n\ endfunction()" ) - set(FASTRTPS_INSTALLER_OPT_DEPS "\ + set(FASTDDS_INSTALLER_OPT_DEPS "\ if (\${type} STREQUAL \"static\")\n\ find_fastdds_deployed_openssl()\n\ endif()") elseif(WIN32) # windows from sources only requires OpenSSL on static libraries - set(FASTRTPS_PACKAGE_WIN32_OPT_DEPS "find_package(OpenSSL REQUIRED)") + set(FASTDDS_PACKAGE_WIN32_OPT_DEPS "find_package(OpenSSL REQUIRED)") else() # linux from sources requires OpenSSL always - set(FASTRTPS_PACKAGE_UNIX_OPT_DEPS "find_package(OpenSSL REQUIRED)") + set(FASTDDS_PACKAGE_UNIX_OPT_DEPS "find_package(OpenSSL REQUIRED)") endif() endif() diff --git a/src/cpp/dds/core/Exception.cpp b/src/cpp/dds/core/Exception.cpp deleted file mode 100644 index c4f47427afe..00000000000 --- a/src/cpp/dds/core/Exception.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include - -#define DEFINE_LOGIC_ERROR_EXCEPTION(ERROR) \ - ERROR::ERROR( \ - const std::string& msg) \ - : Exception() \ - , std::logic_error(msg){} \ - ERROR::ERROR( \ - const ERROR& src) \ - : Exception() \ - , std::logic_error(src.what()){} \ - ERROR::~ERROR() throw(){} \ - const char* ERROR::what() const throw() { return this->std::logic_error::what();} - -#define DEFINE_RUNTIME_ERROR_EXCEPTION(ERROR) \ - ERROR::ERROR( \ - const std::string& msg) \ - : Exception() \ - , std::runtime_error(msg){} \ - ERROR::ERROR( \ - const ERROR& src) \ - : Exception() \ - , std::runtime_error(src.what()){} \ - ERROR::~ERROR() throw(){} \ - const char* ERROR::what() const throw() { return this->std::runtime_error::what();} - -#define DEFINE_INVALID_ARGUMENT_EXCEPTION(ERROR) \ - ERROR::ERROR( \ - const std::string& msg) \ - : Exception() \ - , std::invalid_argument(msg){} \ - ERROR::ERROR( \ - const ERROR& src) \ - : Exception() \ - , std::invalid_argument(src.what()){} \ - ERROR::~ERROR() throw(){} \ - const char* ERROR::what() const throw() { return this->std::invalid_argument::what();} - -namespace dds { -namespace core { - -DEFINE_LOGIC_ERROR_EXCEPTION(Error) -DEFINE_LOGIC_ERROR_EXCEPTION(InvalidDataError) -DEFINE_LOGIC_ERROR_EXCEPTION(PreconditionNotMetError) -DEFINE_LOGIC_ERROR_EXCEPTION(UnsupportedError) -DEFINE_LOGIC_ERROR_EXCEPTION(NotEnabledError) -DEFINE_LOGIC_ERROR_EXCEPTION(InconsistentPolicyError) -DEFINE_LOGIC_ERROR_EXCEPTION(ImmutablePolicyError) -DEFINE_LOGIC_ERROR_EXCEPTION(AlreadyClosedError) -DEFINE_LOGIC_ERROR_EXCEPTION(IllegalOperationError) - -DEFINE_RUNTIME_ERROR_EXCEPTION(OutOfResourcesError) -DEFINE_RUNTIME_ERROR_EXCEPTION(TimeoutError) -DEFINE_RUNTIME_ERROR_EXCEPTION(InvalidDowncastError) -DEFINE_RUNTIME_ERROR_EXCEPTION(NullReferenceError) - -DEFINE_INVALID_ARGUMENT_EXCEPTION(InvalidArgumentError) - -} // namespace core -} // namespace dds diff --git a/src/cpp/dds/core/types.cpp b/src/cpp/dds/core/types.cpp deleted file mode 100644 index 24c99e4ae43..00000000000 --- a/src/cpp/dds/core/types.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2019 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file types.cpp - * - */ - -#include - -using namespace dds::core; - -OMG_DDS_API const null_type dds::core::null; diff --git a/src/cpp/dds/domain/DomainParticipant.cpp b/src/cpp/dds/domain/DomainParticipant.cpp deleted file mode 100644 index a6a040fb57f..00000000000 --- a/src/cpp/dds/domain/DomainParticipant.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/** - * @file DomainParticipantImpl.cpp - */ - -#include -#include -#include - -#include -#include - -namespace dds { -namespace domain { - -DomainParticipant::DomainParticipant( - uint32_t did) - : dds::core::Reference( - eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->create_participant( - did, - eprosima::fastdds::dds::PARTICIPANT_QOS_DEFAULT)) -{ -} - -DomainParticipant::DomainParticipant( - uint32_t id, - const dds::domain::qos::DomainParticipantQos& qos, - dds::domain::DomainParticipantListener* listener, - const dds::core::status::StatusMask& mask) - : dds::core::Reference( - eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->create_participant( - id, - qos, - listener, - mask)) -{ -} - -DomainParticipant::~DomainParticipant() -{ -} - -//void DomainParticipant::listener( -// Listener* /*listener*/, -// const ::dds::core::status::StatusMask& /*event_mask*/) -//{ -// this->delegate()->set_listener(listener /*, event_mask*/); -//} - -//typename DomainParticipant::Listener* DomainParticipant::listener() const -//{ -// return dynamic_cast(this->delegate()->get_listener()); -//} - -const dds::domain::qos::DomainParticipantQos& DomainParticipant::qos() const -{ - return this->delegate()->get_qos(); -} - -void DomainParticipant::qos( - const dds::domain::qos::DomainParticipantQos& qos) -{ - ReturnCode_t code = this->delegate()->set_qos(qos); - if (code == ReturnCode_t::RETCODE_IMMUTABLE_POLICY) - { - throw dds::core::ImmutablePolicyError("Immutable Qos"); - } - else if ( code == ReturnCode_t::RETCODE_INCONSISTENT_POLICY) - { - throw dds::core::InconsistentPolicyError("Inconsistent Qos"); - } - else if (code == ReturnCode_t::RETCODE_UNSUPPORTED) - { - throw dds::core::UnsupportedError("Unsupported values on DomainParticipantQos"); - } -} - -//uint32_t DomainParticipant::domain_id() const -//{ -// return this->delegate()->get_domain_id(); -//} - -//void DomainParticipant::assert_liveliness() -//{ -// this->delegate()->assert_liveliness(); -//} - -//bool DomainParticipant::contains_entity( -// const ::dds::core::InstanceHandle& /*handle*/) -//{ -// return this->delegate()->contains_entity(handle); -//} - -//dds::core::Time DomainParticipant::current_time() const -//{ -// eprosima::fastrtps::Time_t now; -// this->delegate()->get_current_time(now); -// return core::Time(now.seconds, now.nanosec); -//} - -dds::domain::qos::DomainParticipantQos DomainParticipant::default_participant_qos() -{ - qos::DomainParticipantQos qos; - eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->get_default_participant_qos(qos); - return qos; -} - -void DomainParticipant::default_participant_qos( - const ::dds::domain::qos::DomainParticipantQos& qos) -{ - ReturnCode_t code = eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->set_default_participant_qos( - qos); - if (code == ReturnCode_t::RETCODE_INCONSISTENT_POLICY) - { - throw dds::core::InconsistentPolicyError("Inconsistent Qos"); - } - else if (code == ReturnCode_t::RETCODE_UNSUPPORTED) - { - throw dds::core::UnsupportedError("Unsupported values on DomainParticipantQos"); - } -} - -dds::pub::qos::PublisherQos DomainParticipant::default_publisher_qos() const -{ - return this->delegate()->get_default_publisher_qos(); -} - -DomainParticipant& DomainParticipant::default_publisher_qos( - const ::dds::pub::qos::PublisherQos& qos) -{ - ReturnCode_t code = this->delegate()->set_default_publisher_qos(qos); - if (code == ReturnCode_t::RETCODE_INCONSISTENT_POLICY) - { - throw dds::core::InconsistentPolicyError("Inconsistent Qos"); - } - else if (code == ReturnCode_t::RETCODE_UNSUPPORTED) - { - throw dds::core::UnsupportedError("Unsupported values on PublisherQos"); - } - return *this; -} - -dds::sub::qos::SubscriberQos DomainParticipant::default_subscriber_qos() const -{ - return this->delegate()->get_default_subscriber_qos(); -} - -DomainParticipant& DomainParticipant::default_subscriber_qos( - const ::dds::sub::qos::SubscriberQos& qos) -{ - ReturnCode_t result = delegate()->set_default_subscriber_qos(qos); - if (result == ReturnCode_t::RETCODE_INCONSISTENT_POLICY) - { - throw dds::core::InconsistentPolicyError("Inconsistent Qos"); - } - if (result == ReturnCode_t::RETCODE_UNSUPPORTED) - { - throw dds::core::UnsupportedError("Unsupported Qos"); - } - return *this; -} - -dds::topic::qos::TopicQos DomainParticipant::default_topic_qos() const -{ - return this->delegate()->get_default_topic_qos(); -} - -DomainParticipant& DomainParticipant::default_topic_qos( - const dds::topic::qos::TopicQos& qos) -{ - ReturnCode_t ret_code = this->delegate()->set_default_topic_qos(qos); - if (ret_code == ReturnCode_t::RETCODE_INCONSISTENT_POLICY) - { - throw dds::core::InconsistentPolicyError("Inconsistent Qos"); - } - else if (ret_code == ReturnCode_t::RETCODE_UNSUPPORTED) - { - throw dds::core::UnsupportedError("Unsupported values on TopicQos"); - } - return *this; -} - -DomainParticipant& DomainParticipant::operator <<( - const dds::domain::qos::DomainParticipantQos& qos) -{ - this->qos(qos); - return *this; -} - -const DomainParticipant& DomainParticipant::operator >>( - dds::domain::qos::DomainParticipantQos& qos) const -{ - qos = this->qos(); - return *this; -} - -} //namespace domain -} //namespace dds diff --git a/src/cpp/dds/pub/AnyDataWriter.cpp b/src/cpp/dds/pub/AnyDataWriter.cpp deleted file mode 100644 index 0d4e4c1e96c..00000000000 --- a/src/cpp/dds/pub/AnyDataWriter.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -//#ifndef EPROSIMA_DDS_PUB_DETAIL_TANYDATAWRITER_HPP_ -//#define EPROSIMA_DDS_PUB_DETAIL_TANYDATAWRITER_HPP_ - -/** - * @file - */ - - -// TODO This class currently isn't being compiled. When needed, most of its methods will require conversions. - -/* - * OMG PSM class declaration - */ -#include - -namespace dds { -namespace pub { - -template -TAnyDataWriter::~TAnyDataWriter() -{ - publisher_ = nullptr; -} - -//template -//const dds::pub::Publisher& -//TAnyDataWriter::publisher() const -//{ -// return *publisher_; -//} - -//template -//const dds::topic::TopicDescription& TAnyDataWriter::topic_description() const -//{ -// return this->delegate()->topic_description(); -//} - -template -qos::DataWriterQos TAnyDataWriter::qos() const -{ - return this->delegate()->get_qos(); -} - -template -void TAnyDataWriter::qos( - const qos::DataWriterQos& qos) -{ - ReturnCode_t code = this->delegate()->set_qos(qos); - if (code == ReturnCode_t::RETCODE_INCONSISTENT_POLICY) - { - throw dds::core::InconsistentPolicyError("Inconsistent Qos"); - } - else if (code == ReturnCode_t::RETCODE_UNSUPPORTED) - { - throw dds::core::UnsupportedError("Unsupported values on DataWriterQos"); - } - else if (code == ReturnCode_t::RETCODE_IMMUTABLE_POLICY) - { - throw dds::core::ImmutablePolicyError("Immutable Qos"); - } -} - -template -TAnyDataWriter& TAnyDataWriter::operator <<( - const dds::pub::qos::DataWriterQos& qos) -{ - this->qos(qos); - return *this; -} - -template -const TAnyDataWriter& TAnyDataWriter::operator >>( - qos::DataWriterQos& qos) const -{ - qos = this->qos(); - return *this; -} - -//template -//void TAnyDataWriter::wait_for_acknowledgments( -// const dds::core::Duration& timeout) -//{ -// this->delegate()->wait_for_acknowledgments(timeout); -//} - -//template -//const dds::core::status::LivelinessLostStatus TAnyDataWriter::liveliness_lost_status() -//{ -// return this->delegate()->get_liveliness_lost_status(); -//} - -//template -//const dds::core::status::OfferedDeadlineMissedStatus TAnyDataWriter::offered_deadline_missed_status() -//{ -// return this->delegate()->get_offered_deadline_missed_status(); -//} - -//template -//const dds::core::status::OfferedIncompatibleQosStatus TAnyDataWriter::offered_incompatible_qos_status() -//{ -// return this->delegate()->get_offered_incompatible_qos_status(); -//} - -//template -//const dds::core::status::PublicationMatchedStatus TAnyDataWriter::publication_matched_status() -//{ -// return this->delegate()->get_publication_matched_status(); -//} - -//template -//void TAnyDataWriter::assert_liveliness() -//{ -// this->delegate()->assert_liveliness(); -//} - -} //namespace pub -} //namespace dds - - -//#endif //EPROSIMA_DDS_PUB_DETAIL_TANYDATAWRITER_HPP_ diff --git a/src/cpp/dds/pub/DataWriter.cpp b/src/cpp/dds/pub/DataWriter.cpp deleted file mode 100644 index b2dda593846..00000000000 --- a/src/cpp/dds/pub/DataWriter.cpp +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/*************************************************************************** -* -* dds/pub/DataWriter<> WRAPPER implementation. -* Declaration can be found in dds/pub/DataWriter.hpp -* -***************************************************************************/ - -#include -#include -//#include - -#include - -namespace dds { -namespace pub { - -//template -//DataWriter::DataWriter( -// const dds::pub::Publisher& pub, -// const dds::topic::Topic& topic) -// : dds::core::Reference( -// new detail::DataWriter(pub, -// topic, -// pub.is_nil() ? dds::pub::qos::DataWriterQos() : pub.default_datawriter_qos(), -// nullptr, -// dds::core::status::StatusMask::all())) -//{ -// publisher_ = &pub; -//} - -//template -//DataWriter::DataWriter( -// const dds::pub::Publisher& pub, -// const dds::topic::Topic& topic, -// const dds::pub::qos::DataWriterQos& qos, -// dds::pub::DataWriterListener* listener, -// const dds::core::status::StatusMask& mask) -// : dds::core::Reference( -// new detail::DataWriter( -// pub.delegate().get(), -// topic.delegate().get(), -// qos, -// listener, -// mask)) -//{ -// publisher_ = &pub; -//} - -template -DataWriter::~DataWriter() -{ -} - -//template -//void DataWriter::write( -// const T& sample) -//{ -// this->delegate()->write(const_cast(&sample)); -//} - -//template -//void DataWriter::write( -// const T& sample, -// const dds::core::Time& timestamp) -//{ -// this->delegate()->write(const_cast(&sample)); -// //To implement -// (void)timestamp; -//} - -//template -//void DataWriter::write( -// const T& sample, -// const ::dds::core::InstanceHandle& instance) -//{ -// this->delegate()->write(const_cast(&sample), instance); -//} - -//template -//void DataWriter::write( -// const T& sample, -// const ::dds::core::InstanceHandle& instance, -// const dds::core::Time& timestamp) -//{ -// this->delegate()->write_w_timestamp(const_cast(&sample), instance, timestamp); -//} - -//template -//void DataWriter::write( -// const dds::topic::TopicInstance& /*i*/) -//{ -// //To implement -// // this->delegate()->write(i); -//} - -//template -//void DataWriter::write( -// const dds::topic::TopicInstance& /*i*/, -// const dds::core::Time& /*timestamp*/) -//{ -// //To implement -// // this->delegate()->write(i, timestamp); -//} - -//template -//template -//void DataWriter::write( -// const FWIterator& /*begin*/, -// const FWIterator& /*end*/) -//{ -// //To implement -// // FWIterator b = begin; -// // while(b != end) -// // { -// // this->delegate()->write(*b); -// // ++b; -// // } -//} - -//template -//template -//void DataWriter::write( -// const FWIterator& /*begin*/, -// const FWIterator& /*end*/, -// const dds::core::Time& /*timestamp*/) -//{ -// //To implement -// // FWIterator b = begin; -// // while(b != end) -// // { -// // this->delegate()->write(*b, timestamp); -// // ++b; -// // } -//} - -//template -//template< -// typename SamplesFWIterator, -// typename HandlesFWIterator> -//void DataWriter::write( -// const SamplesFWIterator& /*data_begin*/, -// const SamplesFWIterator& /*data_end*/, -// const HandlesFWIterator& /*handle_begin*/, -// const HandlesFWIterator& /*handle_end*/) -//{ -// //To implement -// // SamplesFWIterator data = data_begin; -// // HandlesFWIterator handle = handle_begin; - -// // while(data != data_end && handle != handle_end) -// // { -// // this->delegate()->write(*data, *handle); -// // ++data; -// // ++handle; -// // } -//} - -//template -//template< -// typename SamplesFWIterator, -// typename HandlesFWIterator> -//void DataWriter::write( -// const SamplesFWIterator& /*data_begin*/, -// const SamplesFWIterator& /*data_end*/, -// const HandlesFWIterator& /*handle_begin*/, -// const HandlesFWIterator& /*handle_end*/, -// const dds::core::Time& /*timestamp*/) -//{ -// //To implement -// // SamplesFWIterator data = data_begin; -// // HandlesFWIterator handle = handle_begin; - -// // while(data != data_end && handle != handle_end) -// // { -// // this->delegate()->write(*data, *handle, timestamp); -// // ++data; -// // ++handle; -// // } -//} - -//template -//DataWriter& DataWriter::operator <<( -// const ::dds::pub::qos::DataWriterQos& qos) -//{ -// ReturnCode_t code = this->delegate()->set_qos(qos); -// if (code == ReturnCode_t::RETCODE_INCONSISTENT_POLICY) -// { -// throw dds::core::InconsistentPolicyError("Inconsistent Qos"); -// } -// else if (code == ReturnCode_t::RETCODE_UNSUPPORTED) -// { -// throw dds::core::UnsupportedError("Unsupported values on DataWriterQos"); -// } -// else if (code == ReturnCode_t::RETCODE_IMMUTABLE_POLICY) -// { -// throw dds::core::ImmutablePolicyError("Immutable Qos"); -// } -// return *this; -//} - -//template -//DataWriter& DataWriter::operator <<( -// const T& data) -//{ -// this->write(data); -// return *this; -//} - -//template -//DataWriter& DataWriter::operator <<( -// const std::pair& data) -//{ -// this->write(data.first, data.second); -// return *this; -//} - -//template -//DataWriter& DataWriter::operator <<( -// const std::pair& data) -//{ -// this->write(data.first, data.second); -// return *this; -//} - -//template -//DataWriter& DataWriter::operator <<( -// DataWriter& (*manipulator)(DataWriter&)) -//{ -// return manipulator(*this); -//} - -//template -//const dds::core::InstanceHandle DataWriter::register_instance( -// const T& /*key*/) -//{ -// /* Invalid time will be used as current time. */ -// //return this->delegate()->register_instance(key, dds::core::Time::invalid()); -// return dds::core::InstanceHandle::nil(); -//} - -//template -//const dds::core::InstanceHandle DataWriter::register_instance( -// const T& /*key*/, -// const dds::core::Time& /*timestamp*/) -//{ -// //To implement -// // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); -// // return this->delegate()->register_instance(key, timestamp); -// return dds::core::InstanceHandle::nil(); -//} - -//template -//DataWriter& DataWriter::unregister_instance( -// const ::dds::core::InstanceHandle& /*i*/) -//{ -// //To implement -// // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); -// // /* Invalid time will be used as current time. */ -// // this->delegate()->unregister_instance(i, dds::core::Time::invalid()); -// // return *this; -// return *this; -//} - -//template -//DataWriter& DataWriter::unregister_instance( -// const ::dds::core::InstanceHandle& /*i*/, -// const dds::core::Time& /*timestamp*/) -//{ -// //To implement -// // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); -// // this->delegate()->unregister_instance(i, timestamp); -// // return *this; -// return *this; -//} - -//template -//DataWriter& DataWriter::unregister_instance( -// const T& /*key*/) -//{ -// //To implement -// // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); -// // /* Invalid time will be used as current time. */ -// // this->delegate()->unregister_instance(key, dds::core::Time::invalid()); -// // return *this; -// return *this; -//} - -//template -//DataWriter& DataWriter::unregister_instance( -// const T& /*key*/, -// const dds::core::Time& /*timestamp*/) -//{ -// //To implement -// // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); -// // this->delegate()->unregister_instance(key, timestamp); -// // return *this; -// return *this; -//} - -//template -//DataWriter& DataWriter::dispose_instance( -// const ::dds::core::InstanceHandle& /*i*/) -//{ -// //To implement -// // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); -// // /* Invalid time will be used as current time. */ -// // this->delegate()->dispose_instance(i, dds::core::Time::invalid()); -// // return *this; -// return *this; -//} - -//template -//DataWriter& DataWriter::dispose_instance( -// const ::dds::core::InstanceHandle& /*i*/, -// const dds::core::Time& /*timestamp*/) -//{ -// //To implement -// // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); -// // this->delegate()->dispose_instance(i, timestamp); -// // return *this; -// return *this; -//} - -//template -//DataWriter& DataWriter::dispose_instance( -// const T& key) -//{ -// return this->delegate()->dispose(const_cast(&key)); -//} - -//template -//DataWriter& DataWriter::dispose_instance( -// const T& key, -// const dds::core::Time& timestamp) -//{ -// return this->delegate()->dispose_w_timestamp(const_cast(&key), dds::core::InstanceHandle(), timestamp); -//} - -//template -//dds::topic::TopicInstance& DataWriter::key_value( -// dds::topic::TopicInstance& /*i*/, -// const ::dds::core::InstanceHandle& /*h*/) -//{ -// //To implement -// // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); -// // return this->delegate()->key_value(i, h); -// return dds::topic::TopicInstance(); -//} - -//template -//T& DataWriter::key_value( -// T& /*sample*/, -// const ::dds::core::InstanceHandle& /*h*/) -//{ -// //To implement -// // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); -// // return this->delegate()->key_value(sample, h); -//} - -//template -//dds::core::InstanceHandle DataWriter::lookup_instance( -// const T& /*key*/) -//{ -// //To implement -// // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); -// // return this->delegate()->lookup_instance(key); -// return dds::core::InstanceHandle::nil(); -//} - -//template -//const dds::topic::Topic& DataWriter::topic() const -//{ -// //To implement -// // ISOCPP_REPORT_STACK_DDS_BEGIN(*this); -// // return this->delegate()->topic(); -//} - -//template -//void DataWriter::listener( -// DataWriterListener* listener, -// const ::dds::core::status::StatusMask& mask) -//{ -// this->delegate()->set_listener(listener, mask); -//} - -//template -//DataWriterListener* DataWriter::listener() const -//{ -// return this->delegate()->get_listener(); -//} - -} //namespace dds -} //namespace pub diff --git a/src/cpp/dds/pub/Publisher.cpp b/src/cpp/dds/pub/Publisher.cpp deleted file mode 100644 index a6b2d2f8bc2..00000000000 --- a/src/cpp/dds/pub/Publisher.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2019, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include -#include - -namespace dds { -namespace pub { - -Publisher::Publisher( - const dds::domain::DomainParticipant& dp) - : ::dds::core::Reference( - new detail::Publisher( - dp.delegate().get(), - dp.default_publisher_qos(), - nullptr, - dds::core::status::StatusMask::all())) - , participant_(&dp) -{ -} - -Publisher::Publisher( - const dds::domain::DomainParticipant& dp, - const qos::PublisherQos& qos, - PublisherListener* listener, - const dds::core::status::StatusMask& mask) - : ::dds::core::Reference( - new detail::Publisher( - dp.delegate().get(), qos, listener, mask)) - , participant_(&dp) -{ -} - -Publisher::~Publisher() -{ -} - -const qos::PublisherQos& Publisher::qos() const -{ - return this->delegate()->get_qos(); -} - -void Publisher::qos( - const qos::PublisherQos& pqos) -{ - ReturnCode_t code = this->delegate()->set_qos(pqos); - if (code == ReturnCode_t::RETCODE_IMMUTABLE_POLICY) - { - throw dds::core::ImmutablePolicyError("Immutable Qos"); - } - else if (code == ReturnCode_t::RETCODE_INCONSISTENT_POLICY) - { - throw dds::core::InconsistentPolicyError("Inconsistent Qos"); - } - else if (code == ReturnCode_t::RETCODE_UNSUPPORTED) - { - throw dds::core::UnsupportedError("Unsupported values on DomainParticipantQos"); - } -} - -Publisher& Publisher::operator <<( - const qos::PublisherQos& qos) -{ - this->qos(qos); - return *this; -} - -Publisher& Publisher::operator >>( - qos::PublisherQos& qos) -{ - qos = this->qos(); - return *this; -} - -Publisher& Publisher::default_datawriter_qos( - const qos::DataWriterQos& dwqos) -{ - ReturnCode_t code = this->delegate()->set_default_datawriter_qos(dwqos); - if (code == ReturnCode_t::RETCODE_INCONSISTENT_POLICY) - { - throw dds::core::InconsistentPolicyError("Inconsistent Qos"); - } - if (code == ReturnCode_t::RETCODE_UNSUPPORTED) - { - throw dds::core::UnsupportedError("Unsupported values on DataWriterQos"); - } - return *this; -} - -qos::DataWriterQos Publisher::default_datawriter_qos() const -{ - return this->delegate()->get_default_datawriter_qos(); -} - -//void Publisher::listener( -// Listener* plistener, -// const dds::core::status::StatusMask& /*event_mask*/) -//{ -// delegate()->set_listener(plistener /*, event_mask*/); -//} - -//typename Publisher::Listener* Publisher::listener() const -//{ -// return dynamic_cast(delegate()->get_listener()); -//} - -//void Publisher::wait_for_acknowledgments( -// const dds::core::Duration& timeout) -//{ -// eprosima::fastrtps::Duration_t max_wait(static_cast(timeout.sec()), timeout.nanosec()); -// delegate()->wait_for_acknowledgments(max_wait); -//} - -const dds::domain::DomainParticipant& Publisher::participant() const -{ - return *participant_; -} - -} //namespace pub -} //namespace dds diff --git a/src/cpp/dds/sub/DataReader.cpp b/src/cpp/dds/sub/DataReader.cpp deleted file mode 100644 index dbe018881dd..00000000000 --- a/src/cpp/dds/sub/DataReader.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include -#include -#include - -namespace dds { -namespace sub { - -DataReader::DataReader( - const Subscriber& sub, - const dds::topic::Topic& topic) - : ::dds::core::Reference( - new detail::DataReader( - sub.delegate().get(), - topic.delegate().get(), - sub.default_datareader_qos(), - nullptr, - dds::core::status::StatusMask::all())) - , subscriber_(nullptr) -{ -} - -DataReader::DataReader( - const Subscriber& sub, - const dds::topic::Topic& topic, - const qos::DataReaderQos& qos, - DataReaderListener* listener, - const dds::core::status::StatusMask& mask) - : ::dds::core::Reference( - new detail::DataReader( - sub.delegate().get(), topic.delegate().get(), qos, listener, mask)) - , subscriber_(nullptr) -{ -} - -DataReader::~DataReader() -{ -} - -//const qos::DataReaderQos& DataReader::qos() const -//{ -// return delegate()->get_qos(); -//} - -//void DataReader::qos( -// const qos::DataReaderQos& pqos) -//{ -// delegate()->set_qos(pqos); -//} - -//DataReader& DataReader::operator <<( -// const qos::DataReaderQos& qos) -//{ -// this->qos(qos); -// return *this; -//} - -//DataReader& DataReader::operator >>( -// qos::DataReaderQos& qos) -//{ -// qos = this->qos(); -// return *this; -//} - -//void DataReader::listener( -// Listener* plistener, -// const dds::core::status::StatusMask& /*event_mask*/) -//{ -// delegate()->set_listener(plistener /*, event_mask*/); -//} - -//typename DataReader::Listener* DataReader::listener() const -//{ -// return dynamic_cast(delegate()->get_listener()); -//} - -//const dds::sub::Subscriber& DataReader::subscriber() const -//{ -// eprosima::fastdds::dds::Subscriber s = delegate()->get_subscriber(); -// std::shared_ptr ptr(&s); -// subscriber_->delegate().swap(ptr); - -// return *subscriber; -//} - -} //namespace sub -} //namespace dds - diff --git a/src/cpp/dds/sub/Subscriber.cpp b/src/cpp/dds/sub/Subscriber.cpp deleted file mode 100644 index 69821b6d968..00000000000 --- a/src/cpp/dds/sub/Subscriber.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include -#include - -namespace dds { -namespace sub { - -Subscriber::Subscriber( - const dds::domain::DomainParticipant& dp) - : ::dds::core::Reference( - new detail::Subscriber( - dp.delegate().get(), - dp.default_subscriber_qos(), - nullptr, - dds::core::status::StatusMask::all())) - , participant_(nullptr) -{ -} - -Subscriber::Subscriber( - const dds::domain::DomainParticipant& dp, - const qos::SubscriberQos& qos, - SubscriberListener* listener, - const dds::core::status::StatusMask& mask) - : ::dds::core::Reference( - new detail::Subscriber( - dp.delegate().get(), qos, listener, mask)) - , participant_(&dp) -{ -} - -Subscriber::~Subscriber() -{ -} - -const qos::SubscriberQos& Subscriber::qos() const -{ - return delegate()->get_qos(); -} - -void Subscriber::qos( - const qos::SubscriberQos& pqos) -{ - ReturnCode_t result = delegate()->set_qos(pqos); - if (result == ReturnCode_t::RETCODE_IMMUTABLE_POLICY) - { - throw dds::core::ImmutablePolicyError("Immutable Qos"); - } - else if (result == ReturnCode_t::RETCODE_UNSUPPORTED) - { - throw dds::core::UnsupportedError("Unsupported Qos"); - } - else if (result == ReturnCode_t::RETCODE_INCONSISTENT_POLICY) - { - throw dds::core::InconsistentPolicyError("Inconsistent Qos"); - } -} - -Subscriber& Subscriber::operator <<( - const qos::SubscriberQos& qos) -{ - this->qos(qos); - return *this; -} - -Subscriber& Subscriber::operator >>( - qos::SubscriberQos& qos) -{ - qos = this->qos(); - return *this; -} - -Subscriber& Subscriber::default_datareader_qos( - const qos::DataReaderQos& drqos) -{ - ReturnCode_t result = delegate()->set_default_datareader_qos(drqos); - if ( result == ReturnCode_t::RETCODE_INCONSISTENT_POLICY) - { - throw dds::core::InconsistentPolicyError("Inconsistent Qos"); - } - if ( result == ReturnCode_t::RETCODE_UNSUPPORTED) - { - throw dds::core::UnsupportedError("Unsupported Qos"); - } - return *this; -} - -qos::DataReaderQos Subscriber::default_datareader_qos() const -{ - return delegate()->get_default_datareader_qos(); -} - -//void Subscriber::listener( -// Listener* plistener, -// const dds::core::status::StatusMask& /*event_mask*/) -//{ -// delegate()->set_listener(plistener /*, event_mask*/); -//} - -//typename Subscriber::Listener* Subscriber::listener() const -//{ -// return dynamic_cast(delegate()->get_listener()); -//} - -const dds::domain::DomainParticipant& Subscriber::participant() const -{ - return *participant_; -} - -} //namespace sub -} //namespace dds - diff --git a/src/cpp/dds/topic/Topic.cpp b/src/cpp/dds/topic/Topic.cpp deleted file mode 100644 index 33a2e00c060..00000000000 --- a/src/cpp/dds/topic/Topic.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2020, Proyectos y Sistemas de Mantenimiento SL (eProsima). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/** - * @file - */ - -/* - * OMG PSM class declaration - */ -#include -#include -#include - -namespace dds { -namespace topic { - -Topic::Topic( - const dds::domain::DomainParticipant& dp, - const std::string& topic_name, - const std::string& type_name) - : ::dds::core::Reference( - new detail::Topic( - dp.delegate().get(), - topic_name, - type_name, - dp.default_topic_qos(), - nullptr, - dds::core::status::StatusMask::all())) - , participant_(nullptr) -{ -} - -Topic::Topic( - const dds::domain::DomainParticipant& dp, - const std::string& topic_name, - const std::string& type_name, - const qos::TopicQos& qos, - TopicListener* listener, - const dds::core::status::StatusMask& mask) - : ::dds::core::Reference( - new detail::Topic( - dp.delegate().get(), topic_name, type_name, qos, listener, mask)) - , participant_(nullptr) -{ -} - -Topic::~Topic() -{ -} - - -} //namespace topic -} //namespace dds - diff --git a/src/cpp/dynamic-types/AnnotationParameterValue.cpp b/src/cpp/dynamic-types/AnnotationParameterValue.cpp index 6cfbb6d8a60..685f2fc4127 100644 --- a/src/cpp/dynamic-types/AnnotationParameterValue.cpp +++ b/src/cpp/dynamic-types/AnnotationParameterValue.cpp @@ -70,27 +70,6 @@ ExtendedAnnotationParameterValue& ExtendedAnnotationParameterValue::operator =( return *this; } -size_t ExtendedAnnotationParameterValue::getCdrSerializedSize( - const ExtendedAnnotationParameterValue& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void ExtendedAnnotationParameterValue::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void ExtendedAnnotationParameterValue::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - size_t ExtendedAnnotationParameterValue::getKeyMaxCdrSerializedSize( size_t current_alignment) { @@ -1248,27 +1227,6 @@ ExtendedAnnotationParameterValue& AnnotationParameterValue::extended_value() return m_extended_value; } -size_t AnnotationParameterValue::getCdrSerializedSize( - const AnnotationParameterValue& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void AnnotationParameterValue::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void AnnotationParameterValue::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool AnnotationParameterValue::operator ==( const AnnotationParameterValue& other) const { @@ -1382,18 +1340,6 @@ bool AppliedAnnotationParameter::operator ==( m_value == other.m_value; } -void AppliedAnnotationParameter::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void AppliedAnnotationParameter::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool AppliedAnnotationParameter::isKeyDefined() { return false; @@ -1454,18 +1400,6 @@ bool AppliedAnnotation::operator ==( return false; } -void AppliedAnnotation::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void AppliedAnnotation::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool AppliedAnnotation::isKeyDefined() { return false; @@ -1528,18 +1462,6 @@ bool AppliedVerbatimAnnotation::operator ==( m_text == other.m_text; } -void AppliedVerbatimAnnotation::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void AppliedVerbatimAnnotation::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool AppliedVerbatimAnnotation::isKeyDefined() { return false; @@ -1607,18 +1529,6 @@ bool AppliedBuiltinMemberAnnotations::operator ==( m_hash_id == other.m_hash_id; } -void AppliedBuiltinMemberAnnotations::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void AppliedBuiltinMemberAnnotations::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool AppliedBuiltinMemberAnnotations::isKeyDefined() { return false; diff --git a/src/cpp/dynamic-types/TypeIdentifier.cpp b/src/cpp/dynamic-types/TypeIdentifier.cpp index ce24a3fce37..9c243a8d4af 100644 --- a/src/cpp/dynamic-types/TypeIdentifier.cpp +++ b/src/cpp/dynamic-types/TypeIdentifier.cpp @@ -1087,27 +1087,6 @@ ExtendedTypeDefn& TypeIdentifier::extended_defn() // return union_max_size_serialized - initial_alignment; // } -size_t TypeIdentifier::getCdrSerializedSize( - const TypeIdentifier& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void TypeIdentifier::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void TypeIdentifier::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool TypeIdentifier::operator ==( const TypeIdentifier& other) const { diff --git a/src/cpp/dynamic-types/TypeIdentifierTypes.cpp b/src/cpp/dynamic-types/TypeIdentifierTypes.cpp index 7ba824e1449..c3e10fc0714 100644 --- a/src/cpp/dynamic-types/TypeIdentifierTypes.cpp +++ b/src/cpp/dynamic-types/TypeIdentifierTypes.cpp @@ -74,27 +74,6 @@ StringSTypeDefn& StringSTypeDefn::operator =( return *this; } -size_t StringSTypeDefn::getCdrSerializedSize( - const StringSTypeDefn& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void StringSTypeDefn::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void StringSTypeDefn::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool StringSTypeDefn::consistent( const StringSTypeDefn& x, const TypeConsistencyEnforcementQosPolicy& consistency) const @@ -148,27 +127,6 @@ StringLTypeDefn& StringLTypeDefn::operator =( return *this; } -size_t StringLTypeDefn::getCdrSerializedSize( - const StringLTypeDefn& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void StringLTypeDefn::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void StringLTypeDefn::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool StringLTypeDefn::consistent( const StringLTypeDefn& x, const TypeConsistencyEnforcementQosPolicy& consistency) const @@ -226,27 +184,6 @@ PlainCollectionHeader& PlainCollectionHeader::operator =( return *this; } -size_t PlainCollectionHeader::getCdrSerializedSize( - const PlainCollectionHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void PlainCollectionHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void PlainCollectionHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool PlainCollectionHeader::consistent( const PlainCollectionHeader& x, const TypeConsistencyEnforcementQosPolicy&) const @@ -360,27 +297,6 @@ PlainSequenceSElemDefn& PlainSequenceSElemDefn::operator =( return *this; } -size_t PlainSequenceSElemDefn::getCdrSerializedSize( - const PlainSequenceSElemDefn& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void PlainSequenceSElemDefn::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void PlainSequenceSElemDefn::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool PlainSequenceSElemDefn::consistent( const PlainSequenceSElemDefn& x, const TypeConsistencyEnforcementQosPolicy& consistency) const @@ -505,27 +421,6 @@ PlainSequenceLElemDefn& PlainSequenceLElemDefn::operator =( return *this; } -size_t PlainSequenceLElemDefn::getCdrSerializedSize( - const PlainSequenceLElemDefn& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void PlainSequenceLElemDefn::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void PlainSequenceLElemDefn::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool PlainSequenceLElemDefn::consistent( const PlainSequenceLElemDefn& x, const TypeConsistencyEnforcementQosPolicy& consistency) const @@ -652,27 +547,6 @@ PlainArraySElemDefn& PlainArraySElemDefn::operator =( return *this; } -size_t PlainArraySElemDefn::getCdrSerializedSize( - const PlainArraySElemDefn& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void PlainArraySElemDefn::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void PlainArraySElemDefn::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool PlainArraySElemDefn::consistent( const PlainArraySElemDefn& x, const TypeConsistencyEnforcementQosPolicy& consistency) const @@ -810,27 +684,6 @@ PlainArrayLElemDefn& PlainArrayLElemDefn::operator =( return *this; } -size_t PlainArrayLElemDefn::getCdrSerializedSize( - const PlainArrayLElemDefn& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void PlainArrayLElemDefn::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void PlainArrayLElemDefn::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool PlainArrayLElemDefn::consistent( const PlainArrayLElemDefn& x, const TypeConsistencyEnforcementQosPolicy& consistency) const @@ -1036,27 +889,6 @@ PlainMapSTypeDefn& PlainMapSTypeDefn::operator =( return *this; } -size_t PlainMapSTypeDefn::getCdrSerializedSize( - const PlainMapSTypeDefn& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void PlainMapSTypeDefn::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void PlainMapSTypeDefn::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool PlainMapSTypeDefn::consistent( const PlainMapSTypeDefn& x, const TypeConsistencyEnforcementQosPolicy& consistency) const @@ -1276,27 +1108,6 @@ PlainMapLTypeDefn& PlainMapLTypeDefn::operator =( return *this; } -size_t PlainMapLTypeDefn::getCdrSerializedSize( - const PlainMapLTypeDefn& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void PlainMapLTypeDefn::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void PlainMapLTypeDefn::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool PlainMapLTypeDefn::consistent( const PlainMapLTypeDefn& x, const TypeConsistencyEnforcementQosPolicy& consistency) const @@ -1390,27 +1201,6 @@ StronglyConnectedComponentId& StronglyConnectedComponentId::operator =( return *this; } -size_t StronglyConnectedComponentId::getCdrSerializedSize( - const StronglyConnectedComponentId& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void StronglyConnectedComponentId::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void StronglyConnectedComponentId::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool StronglyConnectedComponentId::consistent( const StronglyConnectedComponentId& x, const TypeConsistencyEnforcementQosPolicy&) const @@ -1451,27 +1241,6 @@ ExtendedTypeDefn& ExtendedTypeDefn::operator =( return *this; } -size_t ExtendedTypeDefn::getCdrSerializedSize( - const ExtendedTypeDefn& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void ExtendedTypeDefn::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void ExtendedTypeDefn::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool ExtendedTypeDefn::consistent( const ExtendedTypeDefn&, const TypeConsistencyEnforcementQosPolicy&) const diff --git a/src/cpp/dynamic-types/TypeObject.cpp b/src/cpp/dynamic-types/TypeObject.cpp index 282bdb29425..e226c625577 100644 --- a/src/cpp/dynamic-types/TypeObject.cpp +++ b/src/cpp/dynamic-types/TypeObject.cpp @@ -73,27 +73,6 @@ CommonStructMember& CommonStructMember::operator =( return *this; } -size_t CommonStructMember::getCdrSerializedSize( - const CommonStructMember& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonStructMember::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonStructMember::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonStructMember::operator ==( const CommonStructMember& other) const { @@ -154,27 +133,6 @@ CompleteMemberDetail& CompleteMemberDetail::operator =( return *this; } -size_t CompleteMemberDetail::getCdrSerializedSize( - const CompleteMemberDetail& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteMemberDetail::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteMemberDetail::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteMemberDetail::operator ==( const CompleteMemberDetail& other) const { @@ -231,27 +189,6 @@ MinimalMemberDetail& MinimalMemberDetail::operator =( return *this; } -size_t MinimalMemberDetail::getCdrSerializedSize( - const MinimalMemberDetail& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalMemberDetail::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalMemberDetail::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalMemberDetail::operator ==( const MinimalMemberDetail& other) const { @@ -307,27 +244,6 @@ CompleteStructMember& CompleteStructMember::operator =( return *this; } -size_t CompleteStructMember::getCdrSerializedSize( - const CompleteStructMember& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteStructMember::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteStructMember::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteStructMember::operator ==( const CompleteStructMember& other) const { @@ -384,27 +300,6 @@ MinimalStructMember& MinimalStructMember::operator =( return *this; } -size_t MinimalStructMember::getCdrSerializedSize( - const MinimalStructMember& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalStructMember::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalStructMember::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalStructMember::operator ==( const MinimalStructMember& other) const { @@ -457,27 +352,6 @@ AppliedBuiltinTypeAnnotations& AppliedBuiltinTypeAnnotations::operator =( return *this; } -size_t AppliedBuiltinTypeAnnotations::getCdrSerializedSize( - const AppliedBuiltinTypeAnnotations& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void AppliedBuiltinTypeAnnotations::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void AppliedBuiltinTypeAnnotations::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool AppliedBuiltinTypeAnnotations::operator ==( const AppliedBuiltinTypeAnnotations& other) const { @@ -523,27 +397,6 @@ MinimalTypeDetail& MinimalTypeDetail::operator =( return *this; } -size_t MinimalTypeDetail::getCdrSerializedSize( - const MinimalTypeDetail& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalTypeDetail::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalTypeDetail::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalTypeDetail::consistent( const MinimalTypeDetail&, const TypeConsistencyEnforcementQosPolicy&) const @@ -595,27 +448,6 @@ CompleteTypeDetail& CompleteTypeDetail::operator =( return *this; } -size_t CompleteTypeDetail::getCdrSerializedSize( - const CompleteTypeDetail& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteTypeDetail::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteTypeDetail::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteTypeDetail::operator ==( const CompleteTypeDetail& other) const { @@ -679,27 +511,6 @@ CompleteStructHeader& CompleteStructHeader::operator =( return *this; } -size_t CompleteStructHeader::getCdrSerializedSize( - const CompleteStructHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteStructHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteStructHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteStructHeader::operator ==( const CompleteStructHeader& other) const { @@ -756,27 +567,6 @@ MinimalStructHeader& MinimalStructHeader::operator =( return *this; } -size_t MinimalStructHeader::getCdrSerializedSize( - const MinimalStructHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalStructHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalStructHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalStructHeader::operator ==( const MinimalStructHeader& other) const { @@ -837,27 +627,6 @@ CompleteStructType& CompleteStructType::operator =( return *this; } -size_t CompleteStructType::getCdrSerializedSize( - const CompleteStructType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteStructType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteStructType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteStructType::operator ==( const CompleteStructType& other) const { @@ -981,27 +750,6 @@ MinimalStructType& MinimalStructType::operator =( return *this; } -size_t MinimalStructType::getCdrSerializedSize( - const MinimalStructType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalStructType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalStructType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalStructType::operator ==( const MinimalStructType& other) const { @@ -1129,27 +877,6 @@ CommonUnionMember& CommonUnionMember::operator =( return *this; } -size_t CommonUnionMember::getCdrSerializedSize( - const CommonUnionMember& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonUnionMember::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonUnionMember::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonUnionMember::operator ==( const CommonUnionMember& other) const { @@ -1232,27 +959,6 @@ CompleteUnionMember& CompleteUnionMember::operator =( return *this; } -size_t CompleteUnionMember::getCdrSerializedSize( - const CompleteUnionMember& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteUnionMember::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteUnionMember::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteUnionMember::operator ==( const CompleteUnionMember& other) const { @@ -1309,27 +1015,6 @@ MinimalUnionMember& MinimalUnionMember::operator =( return *this; } -size_t MinimalUnionMember::getCdrSerializedSize( - const MinimalUnionMember& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalUnionMember::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalUnionMember::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalUnionMember::operator ==( const MinimalUnionMember& other) const { @@ -1386,27 +1071,6 @@ CommonDiscriminatorMember& CommonDiscriminatorMember::operator =( return *this; } -size_t CommonDiscriminatorMember::getCdrSerializedSize( - const CommonDiscriminatorMember& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonDiscriminatorMember::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonDiscriminatorMember::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonDiscriminatorMember::operator ==( const CommonDiscriminatorMember& other) const { @@ -1466,27 +1130,6 @@ CompleteDiscriminatorMember& CompleteDiscriminatorMember::operator =( return *this; } -size_t CompleteDiscriminatorMember::getCdrSerializedSize( - const CompleteDiscriminatorMember& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteDiscriminatorMember::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteDiscriminatorMember::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteDiscriminatorMember::operator ==( const CompleteDiscriminatorMember& other) const { @@ -1543,27 +1186,6 @@ MinimalDiscriminatorMember& MinimalDiscriminatorMember::operator =( return *this; } -size_t MinimalDiscriminatorMember::getCdrSerializedSize( - const MinimalDiscriminatorMember& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalDiscriminatorMember::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalDiscriminatorMember::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalDiscriminatorMember::operator ==( const MinimalDiscriminatorMember& other) const { @@ -1614,27 +1236,6 @@ CompleteUnionHeader& CompleteUnionHeader::operator =( return *this; } -size_t CompleteUnionHeader::getCdrSerializedSize( - const CompleteUnionHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteUnionHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteUnionHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteUnionHeader::operator ==( const CompleteUnionHeader& other) const { @@ -1685,27 +1286,6 @@ MinimalUnionHeader& MinimalUnionHeader::operator =( return *this; } -size_t MinimalUnionHeader::getCdrSerializedSize( - const MinimalUnionHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalUnionHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalUnionHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalUnionHeader::operator ==( const MinimalUnionHeader& other) const { @@ -1768,27 +1348,6 @@ CompleteUnionType& CompleteUnionType::operator =( return *this; } -size_t CompleteUnionType::getCdrSerializedSize( - const CompleteUnionType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteUnionType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteUnionType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteUnionType::operator ==( const CompleteUnionType& other) const { @@ -1918,27 +1477,6 @@ MinimalUnionType& MinimalUnionType::operator =( return *this; } -size_t MinimalUnionType::getCdrSerializedSize( - const MinimalUnionType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalUnionType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalUnionType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalUnionType::operator ==( const MinimalUnionType& other) const { @@ -2060,27 +1598,6 @@ CommonAnnotationParameter& CommonAnnotationParameter::operator =( return *this; } -size_t CommonAnnotationParameter::getCdrSerializedSize( - const CommonAnnotationParameter& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonAnnotationParameter::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonAnnotationParameter::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonAnnotationParameter::operator ==( const CommonAnnotationParameter& other) const { @@ -2141,27 +1658,6 @@ CompleteAnnotationParameter& CompleteAnnotationParameter::operator =( return *this; } -size_t CompleteAnnotationParameter::getCdrSerializedSize( - const CompleteAnnotationParameter& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteAnnotationParameter::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteAnnotationParameter::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteAnnotationParameter::operator ==( const CompleteAnnotationParameter& other) const { @@ -2223,27 +1719,6 @@ MinimalAnnotationParameter& MinimalAnnotationParameter::operator =( return *this; } -size_t MinimalAnnotationParameter::getCdrSerializedSize( - const MinimalAnnotationParameter& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalAnnotationParameter::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalAnnotationParameter::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalAnnotationParameter::operator ==( const MinimalAnnotationParameter& other) const { @@ -2297,27 +1772,6 @@ CompleteAnnotationHeader& CompleteAnnotationHeader::operator =( return *this; } -size_t CompleteAnnotationHeader::getCdrSerializedSize( - const CompleteAnnotationHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteAnnotationHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteAnnotationHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteAnnotationHeader::operator ==( const CompleteAnnotationHeader& other) const { @@ -2363,27 +1817,6 @@ MinimalAnnotationHeader& MinimalAnnotationHeader::operator =( return *this; } -size_t MinimalAnnotationHeader::getCdrSerializedSize( - const MinimalAnnotationHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalAnnotationHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalAnnotationHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalAnnotationHeader::consistent( const MinimalAnnotationHeader&, const TypeConsistencyEnforcementQosPolicy&) const @@ -2436,27 +1869,6 @@ CompleteAnnotationType& CompleteAnnotationType::operator =( return *this; } -size_t CompleteAnnotationType::getCdrSerializedSize( - const CompleteAnnotationType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteAnnotationType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteAnnotationType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteAnnotationType::operator ==( const CompleteAnnotationType& other) const { @@ -2521,27 +1933,6 @@ MinimalAnnotationType& MinimalAnnotationType::operator =( return *this; } -size_t MinimalAnnotationType::getCdrSerializedSize( - const MinimalAnnotationType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalAnnotationType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalAnnotationType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalAnnotationType::operator ==( const MinimalAnnotationType& other) const { @@ -2602,27 +1993,6 @@ CommonAliasBody& CommonAliasBody::operator =( return *this; } -size_t CommonAliasBody::getCdrSerializedSize( - const CommonAliasBody& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonAliasBody::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonAliasBody::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonAliasBody::operator ==( const CommonAliasBody& other) const { @@ -2680,27 +2050,6 @@ CompleteAliasBody& CompleteAliasBody::operator =( return *this; } -size_t CompleteAliasBody::getCdrSerializedSize( - const CompleteAliasBody& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteAliasBody::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteAliasBody::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteAliasBody::operator ==( const CompleteAliasBody& other) const { @@ -2755,27 +2104,6 @@ MinimalAliasBody& MinimalAliasBody::operator =( return *this; } -size_t MinimalAliasBody::getCdrSerializedSize( - const MinimalAliasBody& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalAliasBody::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalAliasBody::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalAliasBody::operator ==( const MinimalAliasBody& other) const { @@ -2824,27 +2152,6 @@ CompleteAliasHeader& CompleteAliasHeader::operator =( return *this; } -size_t CompleteAliasHeader::getCdrSerializedSize( - const CompleteAliasHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteAliasHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteAliasHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteAliasHeader::operator ==( const CompleteAliasHeader& other) const { @@ -2887,27 +2194,6 @@ MinimalAliasHeader& MinimalAliasHeader::operator =( return *this; } -size_t MinimalAliasHeader::getCdrSerializedSize( - const MinimalAliasHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalAliasHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalAliasHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - CompleteAliasType::CompleteAliasType() { } @@ -2952,27 +2238,6 @@ CompleteAliasType& CompleteAliasType::operator =( return *this; } -size_t CompleteAliasType::getCdrSerializedSize( - const CompleteAliasType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteAliasType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteAliasType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteAliasType::operator ==( const CompleteAliasType& other) const { @@ -3032,27 +2297,6 @@ MinimalAliasType& MinimalAliasType::operator =( return *this; } -size_t MinimalAliasType::getCdrSerializedSize( - const MinimalAliasType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalAliasType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalAliasType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalAliasType::operator ==( const MinimalAliasType& other) const { @@ -3108,27 +2352,6 @@ CompleteElementDetail& CompleteElementDetail::operator =( return *this; } -size_t CompleteElementDetail::getCdrSerializedSize( - const CompleteElementDetail& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteElementDetail::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteElementDetail::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteElementDetail::operator ==( const CompleteElementDetail& other) const { @@ -3188,27 +2411,6 @@ CommonCollectionElement& CommonCollectionElement::operator =( return *this; } -size_t CommonCollectionElement::getCdrSerializedSize( - const CommonCollectionElement& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonCollectionElement::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonCollectionElement::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonCollectionElement::operator ==( const CommonCollectionElement& other) const { @@ -3264,27 +2466,6 @@ CompleteCollectionElement& CompleteCollectionElement::operator =( return *this; } -size_t CompleteCollectionElement::getCdrSerializedSize( - const CompleteCollectionElement& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteCollectionElement::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteCollectionElement::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteCollectionElement::operator ==( const CompleteCollectionElement& other) const { @@ -3337,27 +2518,6 @@ MinimalCollectionElement& MinimalCollectionElement::operator =( return *this; } -size_t MinimalCollectionElement::getCdrSerializedSize( - const MinimalCollectionElement& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalCollectionElement::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalCollectionElement::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalCollectionElement::operator ==( const MinimalCollectionElement& other) const { @@ -3408,27 +2568,6 @@ CommonCollectionHeader& CommonCollectionHeader::operator =( return *this; } -size_t CommonCollectionHeader::getCdrSerializedSize( - const CommonCollectionHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonCollectionHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonCollectionHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonCollectionHeader::operator ==( const CommonCollectionHeader& other) const { @@ -3484,27 +2623,6 @@ CompleteCollectionHeader& CompleteCollectionHeader::operator =( return *this; } -size_t CompleteCollectionHeader::getCdrSerializedSize( - const CompleteCollectionHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteCollectionHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteCollectionHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteCollectionHeader::operator ==( const CompleteCollectionHeader& other) const { @@ -3557,27 +2675,6 @@ MinimalCollectionHeader& MinimalCollectionHeader::operator =( return *this; } -size_t MinimalCollectionHeader::getCdrSerializedSize( - const MinimalCollectionHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalCollectionHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalCollectionHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalCollectionHeader::operator ==( const MinimalCollectionHeader& other) const { @@ -3636,27 +2733,6 @@ CompleteSequenceType& CompleteSequenceType::operator =( return *this; } -size_t CompleteSequenceType::getCdrSerializedSize( - const CompleteSequenceType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteSequenceType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteSequenceType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteSequenceType::operator ==( const CompleteSequenceType& other) const { @@ -3718,27 +2794,6 @@ MinimalSequenceType& MinimalSequenceType::operator =( return *this; } -size_t MinimalSequenceType::getCdrSerializedSize( - const MinimalSequenceType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalSequenceType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalSequenceType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalSequenceType::operator ==( const MinimalSequenceType& other) const { @@ -3792,27 +2847,6 @@ CommonArrayHeader& CommonArrayHeader::operator =( return *this; } -size_t CommonArrayHeader::getCdrSerializedSize( - const CommonArrayHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonArrayHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonArrayHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonArrayHeader::operator ==( const CommonArrayHeader& other) const { @@ -3884,27 +2918,6 @@ CompleteArrayHeader& CompleteArrayHeader::operator =( return *this; } -size_t CompleteArrayHeader::getCdrSerializedSize( - const CompleteArrayHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteArrayHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteArrayHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteArrayHeader::operator ==( const CompleteArrayHeader& other) const { @@ -3957,27 +2970,6 @@ MinimalArrayHeader& MinimalArrayHeader::operator =( return *this; } -size_t MinimalArrayHeader::getCdrSerializedSize( - const MinimalArrayHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalArrayHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalArrayHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalArrayHeader::operator ==( const MinimalArrayHeader& other) const { @@ -4036,27 +3028,6 @@ CompleteArrayType& CompleteArrayType::operator =( return *this; } -size_t CompleteArrayType::getCdrSerializedSize( - const CompleteArrayType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteArrayType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteArrayType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteArrayType::operator ==( const CompleteArrayType& other) const { @@ -4118,27 +3089,6 @@ MinimalArrayType& MinimalArrayType::operator =( return *this; } -size_t MinimalArrayType::getCdrSerializedSize( - const MinimalArrayType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalArrayType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalArrayType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalArrayType::operator ==( const MinimalArrayType& other) const { @@ -4204,27 +3154,6 @@ CompleteMapType& CompleteMapType::operator =( return *this; } -size_t CompleteMapType::getCdrSerializedSize( - const CompleteMapType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteMapType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteMapType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteMapType::operator ==( const CompleteMapType& other) const { @@ -4292,27 +3221,6 @@ MinimalMapType& MinimalMapType::operator =( return *this; } -size_t MinimalMapType::getCdrSerializedSize( - const MinimalMapType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalMapType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalMapType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalMapType::operator ==( const MinimalMapType& other) const { @@ -4372,27 +3280,6 @@ CommonEnumeratedLiteral& CommonEnumeratedLiteral::operator =( return *this; } -size_t CommonEnumeratedLiteral::getCdrSerializedSize( - const CommonEnumeratedLiteral& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonEnumeratedLiteral::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonEnumeratedLiteral::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonEnumeratedLiteral::operator ==( const CommonEnumeratedLiteral& other) const { @@ -4448,27 +3335,6 @@ CompleteEnumeratedLiteral& CompleteEnumeratedLiteral::operator =( return *this; } -size_t CompleteEnumeratedLiteral::getCdrSerializedSize( - const CompleteEnumeratedLiteral& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteEnumeratedLiteral::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteEnumeratedLiteral::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteEnumeratedLiteral::operator ==( const CompleteEnumeratedLiteral& other) const { @@ -4519,31 +3385,10 @@ MinimalEnumeratedLiteral& MinimalEnumeratedLiteral::operator =( MinimalEnumeratedLiteral& MinimalEnumeratedLiteral::operator =( MinimalEnumeratedLiteral&& x) { - m_common = std::move(x.m_common); - m_detail = std::move(x.m_detail); - - return *this; -} - -size_t MinimalEnumeratedLiteral::getCdrSerializedSize( - const MinimalEnumeratedLiteral& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalEnumeratedLiteral::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalEnumeratedLiteral::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); + m_common = std::move(x.m_common); + m_detail = std::move(x.m_detail); + + return *this; } bool MinimalEnumeratedLiteral::operator ==( @@ -4598,27 +3443,6 @@ CommonEnumeratedHeader& CommonEnumeratedHeader::operator =( return *this; } -size_t CommonEnumeratedHeader::getCdrSerializedSize( - const CommonEnumeratedHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonEnumeratedHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonEnumeratedHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonEnumeratedHeader::operator ==( const CommonEnumeratedHeader& other) const { @@ -4675,27 +3499,6 @@ CompleteEnumeratedHeader& CompleteEnumeratedHeader::operator =( return *this; } -size_t CompleteEnumeratedHeader::getCdrSerializedSize( - const CompleteEnumeratedHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteEnumeratedHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteEnumeratedHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteEnumeratedHeader::operator ==( const CompleteEnumeratedHeader& other) const { @@ -4748,27 +3551,6 @@ MinimalEnumeratedHeader& MinimalEnumeratedHeader::operator =( return *this; } -size_t MinimalEnumeratedHeader::getCdrSerializedSize( - const MinimalEnumeratedHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalEnumeratedHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalEnumeratedHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalEnumeratedHeader::operator ==( const MinimalEnumeratedHeader& other) const { @@ -4827,27 +3609,6 @@ CompleteEnumeratedType& CompleteEnumeratedType::operator =( return *this; } -size_t CompleteEnumeratedType::getCdrSerializedSize( - const CompleteEnumeratedType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteEnumeratedType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteEnumeratedType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteEnumeratedType::operator ==( const CompleteEnumeratedType& other) const { @@ -4971,27 +3732,6 @@ MinimalEnumeratedType& MinimalEnumeratedType::operator =( return *this; } -size_t MinimalEnumeratedType::getCdrSerializedSize( - const MinimalEnumeratedType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalEnumeratedType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalEnumeratedType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalEnumeratedType::operator ==( const MinimalEnumeratedType& other) const { @@ -5111,27 +3851,6 @@ CommonBitflag& CommonBitflag::operator =( return *this; } -size_t CommonBitflag::getCdrSerializedSize( - const CommonBitflag& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonBitflag::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonBitflag::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonBitflag::operator ==( const CommonBitflag& other) const { @@ -5187,27 +3906,6 @@ CompleteBitflag& CompleteBitflag::operator =( return *this; } -size_t CompleteBitflag::getCdrSerializedSize( - const CompleteBitflag& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteBitflag::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteBitflag::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteBitflag::operator ==( const CompleteBitflag& other) const { @@ -5264,27 +3962,6 @@ MinimalBitflag& MinimalBitflag::operator =( return *this; } -size_t MinimalBitflag::getCdrSerializedSize( - const MinimalBitflag& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalBitflag::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalBitflag::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalBitflag::operator ==( const MinimalBitflag& other) const { @@ -5337,27 +4014,6 @@ CommonBitmaskHeader& CommonBitmaskHeader::operator =( return *this; } -size_t CommonBitmaskHeader::getCdrSerializedSize( - const CommonBitmaskHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonBitmaskHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonBitmaskHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonBitmaskHeader::operator ==( const CommonBitmaskHeader& other) const { @@ -5418,27 +4074,6 @@ CompleteBitmaskType& CompleteBitmaskType::operator =( return *this; } -size_t CompleteBitmaskType::getCdrSerializedSize( - const CompleteBitmaskType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteBitmaskType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteBitmaskType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteBitmaskType::operator ==( const CompleteBitmaskType& other) const { @@ -5562,27 +4197,6 @@ MinimalBitmaskType& MinimalBitmaskType::operator =( return *this; } -size_t MinimalBitmaskType::getCdrSerializedSize( - const MinimalBitmaskType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalBitmaskType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalBitmaskType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalBitmaskType::operator ==( const MinimalBitmaskType& other) const { @@ -5710,27 +4324,6 @@ CommonBitfield& CommonBitfield::operator =( return *this; } -size_t CommonBitfield::getCdrSerializedSize( - const CommonBitfield& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CommonBitfield::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CommonBitfield::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CommonBitfield::operator ==( const CommonBitfield& other) const { @@ -5791,27 +4384,6 @@ CompleteBitfield& CompleteBitfield::operator =( return *this; } -size_t CompleteBitfield::getCdrSerializedSize( - const CompleteBitfield& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteBitfield::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteBitfield::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteBitfield::operator ==( const CompleteBitfield& other) const { @@ -5868,27 +4440,6 @@ MinimalBitfield& MinimalBitfield::operator =( return *this; } -size_t MinimalBitfield::getCdrSerializedSize( - const MinimalBitfield& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalBitfield::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalBitfield::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalBitfield::operator ==( const MinimalBitfield& other) const { @@ -5949,27 +4500,6 @@ CompleteBitsetHeader& CompleteBitsetHeader::operator =( return *this; } -size_t CompleteBitsetHeader::getCdrSerializedSize( - const CompleteBitsetHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteBitsetHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteBitsetHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteBitsetHeader::operator ==( const CompleteBitsetHeader& other) const { @@ -6019,27 +4549,6 @@ MinimalBitsetHeader& MinimalBitsetHeader::operator =( return *this; } -size_t MinimalBitsetHeader::getCdrSerializedSize( - const MinimalBitsetHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalBitsetHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalBitsetHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalBitsetHeader::operator ==( const MinimalBitsetHeader& other) const { @@ -6097,27 +4606,6 @@ CompleteBitsetType& CompleteBitsetType::operator =( return *this; } -size_t CompleteBitsetType::getCdrSerializedSize( - const CompleteBitsetType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteBitsetType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteBitsetType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteBitsetType::operator ==( const CompleteBitsetType& other) const { @@ -6241,27 +4729,6 @@ MinimalBitsetType& MinimalBitsetType::operator =( return *this; } -size_t MinimalBitsetType::getCdrSerializedSize( - const MinimalBitsetType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalBitsetType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalBitsetType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalBitsetType::operator ==( const MinimalBitsetType& other) const { @@ -6371,27 +4838,6 @@ CompleteExtendedType& CompleteExtendedType::operator =( return *this; } -size_t CompleteExtendedType::getCdrSerializedSize( - const CompleteExtendedType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteExtendedType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteExtendedType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteExtendedType::consistent( const CompleteExtendedType&, const TypeConsistencyEnforcementQosPolicy&) const @@ -6429,27 +4875,6 @@ MinimalExtendedType& MinimalExtendedType::operator =( return *this; } -size_t MinimalExtendedType::getCdrSerializedSize( - const MinimalExtendedType& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalExtendedType::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalExtendedType::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalExtendedType::consistent( const MinimalExtendedType&, const TypeConsistencyEnforcementQosPolicy&) const @@ -6497,27 +4922,6 @@ TypeIdentifierTypeObjectPair& TypeIdentifierTypeObjectPair::operator =( return *this; } -size_t TypeIdentifierTypeObjectPair::getCdrSerializedSize( - const TypeIdentifierTypeObjectPair& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void TypeIdentifierTypeObjectPair::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void TypeIdentifierTypeObjectPair::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - TypeIdentifierPair::TypeIdentifierPair() { } @@ -6558,27 +4962,6 @@ TypeIdentifierPair& TypeIdentifierPair::operator =( return *this; } -size_t TypeIdentifierPair::getCdrSerializedSize( - const TypeIdentifierPair& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void TypeIdentifierPair::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void TypeIdentifierPair::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - TypeIdentifierWithSize::TypeIdentifierWithSize() { m_typeobject_serialized_size = 0; @@ -6620,27 +5003,6 @@ TypeIdentifierWithSize& TypeIdentifierWithSize::operator =( return *this; } -size_t TypeIdentifierWithSize::getCdrSerializedSize( - const TypeIdentifierWithSize& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void TypeIdentifierWithSize::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void TypeIdentifierWithSize::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - TypeIdentifierWithDependencies::TypeIdentifierWithDependencies() { m_dependent_typeid_count = -1; @@ -6686,27 +5048,6 @@ TypeIdentifierWithDependencies& TypeIdentifierWithDependencies::operator =( return *this; } -size_t TypeIdentifierWithDependencies::getCdrSerializedSize( - const TypeIdentifierWithDependencies& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void TypeIdentifierWithDependencies::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void TypeIdentifierWithDependencies::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - ///////////////////////////////////////////////////////////////////////////////////////////////////////// CompleteTypeObject::CompleteTypeObject() @@ -7468,27 +5809,6 @@ CompleteExtendedType& CompleteTypeObject::extended_type() return m_extended_type; } -size_t CompleteTypeObject::getCdrSerializedSize( - const CompleteTypeObject& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void CompleteTypeObject::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void CompleteTypeObject::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool CompleteTypeObject::operator ==( const CompleteTypeObject& other) const { @@ -8347,27 +6667,6 @@ MinimalExtendedType& MinimalTypeObject::extended_type() return m_extended_type; } -size_t MinimalTypeObject::getCdrSerializedSize( - const MinimalTypeObject& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void MinimalTypeObject::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void MinimalTypeObject::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool MinimalTypeObject::operator ==( const MinimalTypeObject& other) const { @@ -8739,27 +7038,6 @@ MinimalTypeObject& TypeObject::minimal() return m_minimal; } -size_t TypeObject::getCdrSerializedSize( - const TypeObject& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void TypeObject::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void TypeObject::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - bool TypeObject::operator ==( const TypeObject& other) const { @@ -8818,27 +7096,6 @@ TypeInformation& TypeInformation::operator =( return *this; } -size_t TypeInformation::getCdrSerializedSize( - const TypeInformation& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void TypeInformation::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void TypeInformation::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - OctetSeq& operator ++( OctetSeq& s) { diff --git a/src/cpp/fastdds/builtin/common/RPCHeadersImpl.cpp b/src/cpp/fastdds/builtin/common/RPCHeadersImpl.cpp deleted file mode 100644 index 5cdca291d7d..00000000000 --- a/src/cpp/fastdds/builtin/common/RPCHeadersImpl.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2019 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file RPCHeadersImpl.cpp - * - */ - -#include -#include -#include - -#include "RPCHeadersImplCdrAux.ipp" - -namespace eprosima { -namespace fastdds { -namespace dds { -namespace rpc { - -size_t ReplyHeader::getCdrSerializedSize( - const ReplyHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void ReplyHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void ReplyHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - -size_t RequestHeader::getCdrSerializedSize( - const RequestHeader& data, - size_t current_alignment) -{ - size_t initial_alignment = current_alignment; - eprosima::fastcdr::CdrSizeCalculator calculator(eprosima::fastcdr::CdrVersion::XCDRv1); - return eprosima::fastcdr::calculate_serialized_size(calculator, data, current_alignment) - initial_alignment; -} - -void RequestHeader::serialize( - eprosima::fastcdr::Cdr& scdr) const -{ - eprosima::fastcdr::serialize(scdr, *this); -} - -void RequestHeader::deserialize( - eprosima::fastcdr::Cdr& dcdr) -{ - eprosima::fastcdr::deserialize(dcdr, *this); -} - -} // namespace rpc -} // namespace dds -} // namespace fastdds -} // namespace eprosima diff --git a/src/cpp/fastdds/builtin/typelookup/TypeLookupReplyListener.cpp b/src/cpp/fastdds/builtin/typelookup/TypeLookupReplyListener.cpp index 3efe307b383..3ae4d03ce22 100644 --- a/src/cpp/fastdds/builtin/typelookup/TypeLookupReplyListener.cpp +++ b/src/cpp/fastdds/builtin/typelookup/TypeLookupReplyListener.cpp @@ -18,16 +18,15 @@ */ #include + #include -#include +#include #include - +#include +#include +#include #include -#include -#include -#include - #include using eprosima::fastrtps::rtps::RTPSReader; diff --git a/src/cpp/fastdds/builtin/typelookup/TypeLookupRequestListener.cpp b/src/cpp/fastdds/builtin/typelookup/TypeLookupRequestListener.cpp index f2ccfe37cc8..c716f904960 100644 --- a/src/cpp/fastdds/builtin/typelookup/TypeLookupRequestListener.cpp +++ b/src/cpp/fastdds/builtin/typelookup/TypeLookupRequestListener.cpp @@ -17,17 +17,15 @@ * */ -#include -#include -#include - -#include +#include -#include -#include +#include +#include +#include #include - -#include +#include +#include +#include using eprosima::fastrtps::rtps::RTPSReader; using eprosima::fastrtps::rtps::CacheChange_t; diff --git a/src/cpp/fastdds/builtin/typelookup/common/TypeLookupTypes.cpp b/src/cpp/fastdds/builtin/typelookup/common/TypeLookupTypes.cpp index 7876c5f1a4c..19be0b934e8 100644 --- a/src/cpp/fastdds/builtin/typelookup/common/TypeLookupTypes.cpp +++ b/src/cpp/fastdds/builtin/typelookup/common/TypeLookupTypes.cpp @@ -18,6 +18,9 @@ */ #include + +#include +#include #include #include @@ -30,6 +33,7 @@ using eprosima::fastrtps::types::TypeIdentifierWithSize; using eprosima::fastrtps::types::TypeIdentifierPair; using eprosima::fastrtps::types::TypeIdentifierTypeObjectPair; +#include #include "TypeLookupTypesCdrAux.ipp" namespace eprosima { diff --git a/src/cpp/fastdds/core/policy/ParameterList.cpp b/src/cpp/fastdds/core/policy/ParameterList.cpp index e59da3520b2..8090868f2d6 100644 --- a/src/cpp/fastdds/core/policy/ParameterList.cpp +++ b/src/cpp/fastdds/core/policy/ParameterList.cpp @@ -93,7 +93,7 @@ bool ParameterList::updateCacheChangeFromInlineQos( * Changing this here implies a behaviour change in the * RTPS layer, so it is postponed until the next major release. */ - FASTDDS_TODO_BEFORE(3, 0, "Fill related sample identity instead"); + // FASTDDS_TODO_BEFORE(3, 0, "Fill related sample identity instead"); change.write_params.sample_identity(p.sample_id); } break; diff --git a/src/cpp/fastdds/domain/DomainParticipantImpl.cpp b/src/cpp/fastdds/domain/DomainParticipantImpl.cpp index 56e4023b637..5e8fe1603aa 100644 --- a/src/cpp/fastdds/domain/DomainParticipantImpl.cpp +++ b/src/cpp/fastdds/domain/DomainParticipantImpl.cpp @@ -1560,10 +1560,6 @@ void DomainParticipantImpl::MyRTPSParticipantListener::onParticipantDiscovery( { participant_->listener_->on_participant_discovery(participant_->participant_, std::move(info), should_be_ignored); - if (!should_be_ignored) - { - participant_->listener_->on_participant_discovery(participant_->participant_, std::move(info)); - } } } diff --git a/src/cpp/fastdds/domain/DomainParticipantImpl.hpp b/src/cpp/fastdds/domain/DomainParticipantImpl.hpp index f2746ed522c..d0d7d96d476 100644 --- a/src/cpp/fastdds/domain/DomainParticipantImpl.hpp +++ b/src/cpp/fastdds/domain/DomainParticipantImpl.hpp @@ -77,7 +77,7 @@ class ReaderFilterCollection; /** * This is the implementation class of the DomainParticipant. - * @ingroup FASTRTPS_MODULE + * @ingroup FASTDDS_MODULE */ class DomainParticipantImpl { @@ -468,7 +468,7 @@ class DomainParticipantImpl /** * This method can be used when using a StaticEndpointDiscovery mechanism different that the one - * included in FastRTPS, for example when communicating with other implementations. + * included in Fast DDS, for example when communicating with other implementations. * It indicates the Participant that an Endpoint from the XML has been discovered and * should be activated. * @param partguid Participant GUID_t. diff --git a/src/cpp/fastdds/publisher/DataWriter.cpp b/src/cpp/fastdds/publisher/DataWriter.cpp index 92e10412200..8e9c9dd88c6 100644 --- a/src/cpp/fastdds/publisher/DataWriter.cpp +++ b/src/cpp/fastdds/publisher/DataWriter.cpp @@ -106,17 +106,6 @@ ReturnCode_t DataWriter::write_w_timestamp( return impl_->write_w_timestamp(data, handle, timestamp); } -ReturnCode_t DataWriter::write_w_timestamp( - void* data, - const InstanceHandle_t& handle, - const fastrtps::rtps::Time_t& timestamp) -{ - static_cast (data); - static_cast (handle); - static_cast (timestamp); - return ReturnCode_t::RETCODE_UNSUPPORTED; -} - InstanceHandle_t DataWriter::register_instance( void* instance) { @@ -130,16 +119,6 @@ InstanceHandle_t DataWriter::register_instance_w_timestamp( return impl_->register_instance_w_timestamp(instance, timestamp); } -InstanceHandle_t DataWriter::register_instance_w_timestamp( - void* instance, - const fastrtps::rtps::Time_t& timestamp) -{ - static_cast (instance); - static_cast (timestamp); - EPROSIMA_LOG_WARNING(DATA_WRITER, "register_instance_w_timestamp method not yet implemented"); - return HANDLE_NIL; -} - ReturnCode_t DataWriter::unregister_instance( void* instance, const InstanceHandle_t& handle) @@ -155,17 +134,6 @@ ReturnCode_t DataWriter::unregister_instance_w_timestamp( return impl_->unregister_instance_w_timestamp(instance, handle, timestamp); } -ReturnCode_t DataWriter::unregister_instance_w_timestamp( - void* instance, - const InstanceHandle_t& handle, - const fastrtps::rtps::Time_t& timestamp) -{ - static_cast (instance); - static_cast (handle); - static_cast (timestamp); - return ReturnCode_t::RETCODE_UNSUPPORTED; -} - ReturnCode_t DataWriter::get_key_value( void* key_holder, const InstanceHandle_t& handle) @@ -320,16 +288,6 @@ ReturnCode_t DataWriter::get_matched_subscriptions( */ } -ReturnCode_t DataWriter::get_matched_subscriptions( - std::vector& subscription_handles) const -{ - static_cast (subscription_handles); - return ReturnCode_t::RETCODE_UNSUPPORTED; - /* - return impl_->get_matched_subscription_data(subscription_handles); - */ -} - ReturnCode_t DataWriter::clear_history( size_t* removed) { diff --git a/src/cpp/fastdds/publisher/DataWriterHistory.hpp b/src/cpp/fastdds/publisher/DataWriterHistory.hpp index 281d460417d..c3142a9170b 100644 --- a/src/cpp/fastdds/publisher/DataWriterHistory.hpp +++ b/src/cpp/fastdds/publisher/DataWriterHistory.hpp @@ -22,12 +22,12 @@ #include #include +#include #include #include #include #include #include -#include #include diff --git a/src/cpp/fastdds/publisher/DataWriterImpl.cpp b/src/cpp/fastdds/publisher/DataWriterImpl.cpp index 726f899561b..d5f6dce27d7 100644 --- a/src/cpp/fastdds/publisher/DataWriterImpl.cpp +++ b/src/cpp/fastdds/publisher/DataWriterImpl.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -41,7 +42,6 @@ #include #include #include -#include #include #include @@ -1173,7 +1173,7 @@ ReturnCode_t DataWriterImpl::set_qos( if (enabled) { - if (qos_.reliability().kind == eprosima::fastrtps::RELIABLE_RELIABILITY_QOS && + if (qos_.reliability().kind == ReliabilityQosPolicyKind::RELIABLE_RELIABILITY_QOS && qos_.reliable_writer_qos() == qos_to_set.reliable_writer_qos()) { // Update times and positive_acks attributes on RTPS Layer @@ -1305,7 +1305,7 @@ void DataWriterImpl::InnerDataWriterListener::onWriterChangeReceivedByAll( void DataWriterImpl::InnerDataWriterListener::on_liveliness_lost( fastrtps::rtps::RTPSWriter* /*writer*/, - const fastrtps::LivelinessLostStatus& status) + const LivelinessLostStatus& status) { data_writer_->update_liveliness_lost_status(status); StatusMask notify_status = StatusMask::liveliness_lost(); @@ -1682,7 +1682,7 @@ OfferedIncompatibleQosStatus& DataWriterImpl::update_offered_incompatible_qos( } LivelinessLostStatus& DataWriterImpl::update_liveliness_lost_status( - const fastrtps::LivelinessLostStatus& liveliness_lost_status) + const LivelinessLostStatus& liveliness_lost_status) { liveliness_lost_status_.total_count = liveliness_lost_status.total_count; liveliness_lost_status_.total_count_change += liveliness_lost_status.total_count_change; diff --git a/src/cpp/fastdds/publisher/DataWriterImpl.hpp b/src/cpp/fastdds/publisher/DataWriterImpl.hpp index 98b6119b5df..462b4dd4596 100644 --- a/src/cpp/fastdds/publisher/DataWriterImpl.hpp +++ b/src/cpp/fastdds/publisher/DataWriterImpl.hpp @@ -16,39 +16,34 @@ * @file DataWriterImpl.hpp */ -#ifndef _FASTRTPS_DATAWRITERIMPL_HPP_ -#define _FASTRTPS_DATAWRITERIMPL_HPP_ +#ifndef _FASTDDS_DATAWRITERIMPL_HPP_ +#define _FASTDDS_DATAWRITERIMPL_HPP_ #include #include +#include #include #include #include #include #include #include - #include -#include #include +#include #include #include #include #include #include - -#include -#include - #include #include #include - #include -#include #include +#include using eprosima::fastrtps::types::ReturnCode_t; @@ -317,7 +312,7 @@ class DataWriterImpl : protected rtps::IReaderDataFilter PublicationMatchedStatus& status); ReturnCode_t get_offered_deadline_missed_status( - fastrtps::OfferedDeadlineMissedStatus& status); + OfferedDeadlineMissedStatus& status); ReturnCode_t get_offered_incompatible_qos_status( OfferedIncompatibleQosStatus& status); @@ -445,7 +440,7 @@ class DataWriterImpl : protected rtps::IReaderDataFilter void on_liveliness_lost( fastrtps::rtps::RTPSWriter* writer, - const fastrtps::LivelinessLostStatus& status) override; + const LivelinessLostStatus& status) override; void on_reader_discovery( fastrtps::rtps::RTPSWriter* writer, @@ -649,7 +644,7 @@ class DataWriterImpl : protected rtps::IReaderDataFilter * @return Current liveliness lost status. */ LivelinessLostStatus& update_liveliness_lost_status( - const fastrtps::LivelinessLostStatus& liveliness_lost_status); + const LivelinessLostStatus& liveliness_lost_status); /** * Returns the most appropriate listener to handle the callback for the given status, @@ -745,4 +740,4 @@ class DataWriterImpl : protected rtps::IReaderDataFilter } /* namespace fastdds */ } /* namespace eprosima */ -#endif //_FASTRTPS_DATAWRITERIMPL_HPP_ +#endif //_FASTDDS_DATAWRITERIMPL_HPP_ diff --git a/src/cpp/fastdds/publisher/PublisherImpl.cpp b/src/cpp/fastdds/publisher/PublisherImpl.cpp index 9524d69050c..8ba526b2437 100644 --- a/src/cpp/fastdds/publisher/PublisherImpl.cpp +++ b/src/cpp/fastdds/publisher/PublisherImpl.cpp @@ -200,7 +200,7 @@ void PublisherImpl::PublisherWriterListener::on_liveliness_lost( void PublisherImpl::PublisherWriterListener::on_offered_deadline_missed( DataWriter* writer, - const fastrtps::OfferedDeadlineMissedStatus& status) + const OfferedDeadlineMissedStatus& status) { if (publisher_->listener_ != nullptr) { diff --git a/src/cpp/fastdds/publisher/PublisherImpl.hpp b/src/cpp/fastdds/publisher/PublisherImpl.hpp index 8ad109b63ea..036f268a1a9 100644 --- a/src/cpp/fastdds/publisher/PublisherImpl.hpp +++ b/src/cpp/fastdds/publisher/PublisherImpl.hpp @@ -22,19 +22,18 @@ #define _FASTDDS_PUBLISHERIMPL_HPP_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#include +#include +#include + +#include +#include +#include #include -#include #include -#include +#include #include #include -#include -#include - -#include -#include #ifdef FASTDDS_STATISTICS #include @@ -67,7 +66,7 @@ class TypeSupport; /** * Class PublisherImpl, contains the actual implementation of the behaviour of the Publisher. - * @ingroup FASTRTPS_MODULE + * @ingroup FASTDDS_MODULE */ class PublisherImpl { @@ -244,7 +243,7 @@ class PublisherImpl void on_offered_deadline_missed( DataWriter* writer, - const fastrtps::OfferedDeadlineMissedStatus& status) override; + const OfferedDeadlineMissedStatus& status) override; void on_liveliness_lost( DataWriter* writer, diff --git a/src/cpp/fastdds/subscriber/DataReaderImpl.cpp b/src/cpp/fastdds/subscriber/DataReaderImpl.cpp index 194a3b0e860..911507f9994 100644 --- a/src/cpp/fastdds/subscriber/DataReaderImpl.cpp +++ b/src/cpp/fastdds/subscriber/DataReaderImpl.cpp @@ -23,8 +23,7 @@ # include #endif // if defined(__has_include) && __has_include() -#include -#include +#include #include #include #include @@ -34,21 +33,22 @@ #include #include #include -#include #include #include #include #include #include +#include + +#include +#include +#include +#include #include #include #include #include #include -#include -#include -#include - #include #include #ifdef FASTDDS_STATISTICS diff --git a/src/cpp/fastdds/subscriber/DataReaderImpl.hpp b/src/cpp/fastdds/subscriber/DataReaderImpl.hpp index 857a336a2cf..af71620a5f3 100644 --- a/src/cpp/fastdds/subscriber/DataReaderImpl.hpp +++ b/src/cpp/fastdds/subscriber/DataReaderImpl.hpp @@ -17,14 +17,15 @@ * */ -#ifndef _FASTRTPS_DATAREADERIMPL_HPP_ -#define _FASTRTPS_DATAREADERIMPL_HPP_ +#ifndef _FASTDDS_DATAREADERIMPL_HPP_ +#define _FASTDDS_DATAREADERIMPL_HPP_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC #include #include #include +#include #include #include #include @@ -36,16 +37,15 @@ #include #include #include +#include +#include + #include #include #include #include #include #include -#include -#include -#include - #include namespace eprosima { @@ -238,7 +238,7 @@ class DataReaderImpl SubscriptionMatchedStatus& status); ReturnCode_t get_requested_deadline_missed_status( - fastrtps::RequestedDeadlineMissedStatus& status); + RequestedDeadlineMissedStatus& status); ReturnCode_t set_qos( const DataReaderQos& qos); @@ -257,7 +257,7 @@ class DataReaderImpl */ ReturnCode_t get_liveliness_changed_status( - fastrtps::LivelinessChangedStatus& status); + LivelinessChangedStatus& status); ReturnCode_t get_requested_incompatible_qos_status( RequestedIncompatibleQosStatus& status); @@ -280,7 +280,7 @@ class DataReaderImpl * @return RETCODE_OK */ ReturnCode_t get_sample_rejected_status( - fastrtps::SampleRejectedStatus& status); + SampleRejectedStatus& status); const Subscriber* get_subscriber() const; @@ -428,7 +428,7 @@ class DataReaderImpl void on_liveliness_changed( fastrtps::rtps::RTPSReader* reader, - const fastrtps::LivelinessChangedStatus& status) override; + const LivelinessChangedStatus& status) override; void on_requested_incompatible_qos( fastrtps::rtps::RTPSReader* reader, @@ -472,7 +472,7 @@ class DataReaderImpl LivelinessChangedStatus liveliness_changed_status_; //! Requested deadline missed status - fastrtps::RequestedDeadlineMissedStatus deadline_missed_status_; + RequestedDeadlineMissedStatus deadline_missed_status_; //! Requested incompatible QoS status RequestedIncompatibleQosStatus requested_incompatible_qos_status_; @@ -613,7 +613,7 @@ class DataReaderImpl PolicyMask incompatible_policies); LivelinessChangedStatus& update_liveliness_status( - const fastrtps::LivelinessChangedStatus& status); + const LivelinessChangedStatus& status); const SampleLostStatus& update_sample_lost_status( int32_t sample_lost_since_last_update); @@ -660,4 +660,4 @@ class DataReaderImpl } /* namespace eprosima */ #endif // ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#endif /* _FASTRTPS_DATAREADERIMPL_HPP_*/ +#endif /* _FASTDDS_DATAREADERIMPL_HPP_*/ diff --git a/src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp b/src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp index 8b0e49e953b..29eb2365899 100644 --- a/src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp +++ b/src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp @@ -244,7 +244,7 @@ struct ReadTakeCommand * More importantly, the related sample identity should be taken from the related sample identity * in write_params. */ - FASTDDS_TODO_BEFORE(3, 0, "Fill both sample_identity and related_sample_identity with write_params"); + // FASTDDS_TODO_BEFORE(3, 0, "Fill both sample_identity and related_sample_identity with write_params"); info.sample_identity.writer_guid(item->writerGUID); info.sample_identity.sequence_number(item->sequenceNumber); info.related_sample_identity = item->write_params.sample_identity(); diff --git a/src/cpp/fastdds/subscriber/SubscriberImpl.cpp b/src/cpp/fastdds/subscriber/SubscriberImpl.cpp index b1003634ca6..82328e99fb0 100644 --- a/src/cpp/fastdds/subscriber/SubscriberImpl.cpp +++ b/src/cpp/fastdds/subscriber/SubscriberImpl.cpp @@ -481,7 +481,7 @@ void SubscriberImpl::SubscriberReaderListener::on_subscription_matched( void SubscriberImpl::SubscriberReaderListener::on_requested_deadline_missed( DataReader* reader, - const fastrtps::RequestedDeadlineMissedStatus& status) + const RequestedDeadlineMissedStatus& status) { if (subscriber_->listener_ != nullptr) { @@ -491,7 +491,7 @@ void SubscriberImpl::SubscriberReaderListener::on_requested_deadline_missed( void SubscriberImpl::SubscriberReaderListener::on_liveliness_changed( DataReader* reader, - const fastrtps::LivelinessChangedStatus& status) + const LivelinessChangedStatus& status) { (void)status; @@ -518,7 +518,7 @@ void SubscriberImpl::SubscriberReaderListener::on_liveliness_changed( void SubscriberImpl::SubscriberReaderListener::on_sample_rejected( DataReader* /*reader*/, - const fastrtps::SampleRejectedStatus& /*status*/) + const SampleRejectedStatus& /*status*/) { /* TODO if (subscriber_->listener_ != nullptr) diff --git a/src/cpp/fastdds/subscriber/SubscriberImpl.hpp b/src/cpp/fastdds/subscriber/SubscriberImpl.hpp index 3a61940611e..f7cf395aac3 100644 --- a/src/cpp/fastdds/subscriber/SubscriberImpl.hpp +++ b/src/cpp/fastdds/subscriber/SubscriberImpl.hpp @@ -30,11 +30,9 @@ #include #include #include -#include #include - using eprosima::fastrtps::types::ReturnCode_t; namespace eprosima { @@ -62,7 +60,7 @@ class TypeSupport; /** * Class SubscriberImpl, contains the actual implementation of the behaviour of the Subscriber. - * @ingroup FASTRTPS_MODULE + * @ingroup FASTDDS_MODULE */ class SubscriberImpl { @@ -272,15 +270,15 @@ class SubscriberImpl void on_requested_deadline_missed( DataReader* reader, - const fastrtps::RequestedDeadlineMissedStatus& status) override; + const RequestedDeadlineMissedStatus& status) override; void on_liveliness_changed( DataReader* reader, - const fastrtps::LivelinessChangedStatus& status) override; + const LivelinessChangedStatus& status) override; void on_sample_rejected( DataReader* reader, - const fastrtps::SampleRejectedStatus& status) override; + const SampleRejectedStatus& status) override; void on_requested_incompatible_qos( DataReader* reader, diff --git a/src/cpp/fastrtps.rc b/src/cpp/fastrtps.rc index 050833f63fb..74e13bab86e 100644 --- a/src/cpp/fastrtps.rc +++ b/src/cpp/fastrtps.rc @@ -78,15 +78,15 @@ END // Version // -#define VER_PRODUCTVERSION FASTRTPS_VERSION_MAJOR,FASTRTPS_VERSION_MINOR,FASTRTPS_VERSION_MICRO,0 -#define VER_PRODUCTVERSION_STR FASTRTPS_VERSION_STR +#define VER_PRODUCTVERSION FASTDDS_VERSION_MAJOR,FASTDDS_VERSION_MINOR,FASTDDS_VERSION_MICRO,0 +#define VER_PRODUCTVERSION_STR FASTDDS_VERSION_STR #define VER_COMPANYNAME_STR "eProsima" -#define VER_FILEDESCRIPTION_STR "Library to use RTPS protocol" +#define VER_FILEDESCRIPTION_STR "Library to use DDS protocol" #define VER_LEGALCOPYRIGHT_STR "Copyright 2015 (c)" -#define VER_PRODUCTNAME_STR "FastRTPS" +#define VER_PRODUCTNAME_STR "Fast DDS" #ifdef _WIN32 -#if defined(fastrtps_EXPORTS) +#if defined(fastdds_EXPORTS) #ifndef _DEBUG #define VER_DEBUG 0 diff --git a/src/cpp/fastrtps_deprecated/Domain.cpp b/src/cpp/fastrtps_deprecated/Domain.cpp deleted file mode 100644 index f2f595bdcac..00000000000 --- a/src/cpp/fastrtps_deprecated/Domain.cpp +++ /dev/null @@ -1,449 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file Domain.cpp - * - */ - -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -using namespace eprosima::fastrtps::rtps; -using namespace eprosima::fastrtps::xmlparser; -using namespace eprosima::fastrtps::types; - -namespace eprosima { -namespace fastrtps { - -std::mutex Domain::m_mutex; -std::vector Domain::m_participants; -bool Domain::default_xml_profiles_loaded = false; - - -Domain::Domain() -{ - // TODO Auto-generated constructor stub -} - -Domain::~Domain() -{ - -} - -void Domain::stopAll() -{ - { - std::lock_guard guard(m_mutex); - while (m_participants.size() > 0) - { - delete(m_participants.back().second); - m_participants.pop_back(); - } - } - - // Deletes DynamicTypes and TypeObject factories - types::DynamicTypeBuilderFactory::delete_instance(); - types::DynamicDataFactory::delete_instance(); - types::TypeObjectFactory::delete_instance(); - XMLProfileManager::DeleteInstance(); - - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - eprosima::fastdds::dds::Log::KillThread(); -} - -bool Domain::removeParticipant( - Participant* part) -{ - if (part != nullptr) - { - std::lock_guard guard(m_mutex); - - for (auto it = m_participants.begin(); it != m_participants.end(); ++it) - { - if (it->second->getGuid() == part->getGuid()) - { - //FOUND - delete(it->second); - m_participants.erase(it); - return true; - } - } - } - return false; -} - -bool Domain::removePublisher( - Publisher* pub) -{ - if (pub != nullptr) - { - std::lock_guard guard(m_mutex); - - for (auto it = m_participants.begin(); it != m_participants.end(); ++it) - { - if (it->second->getGuid().guidPrefix == pub->getGuid().guidPrefix) - { - //FOUND - return it->second->removePublisher(pub); - } - } - } - return false; -} - -bool Domain::removeSubscriber( - Subscriber* sub) -{ - if (sub != nullptr) - { - std::lock_guard guard(m_mutex); - - for (auto it = m_participants.begin(); it != m_participants.end(); ++it) - { - if (it->second->getGuid().guidPrefix == sub->getGuid().guidPrefix) - { - //FOUND - return it->second->removeSubscriber(sub); - } - } - } - return false; -} - -Participant* Domain::createParticipant( - const std::string& participant_profile, - ParticipantListener* listen) -{ - if (false == default_xml_profiles_loaded) - { - SystemInfo::set_environment_file(); - XMLProfileManager::loadDefaultXMLFile(); - default_xml_profiles_loaded = true; - } - - ParticipantAttributes participant_att; - if ( XMLP_ret::XML_ERROR == XMLProfileManager::fillParticipantAttributes(participant_profile, participant_att)) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Problem loading profile '" << participant_profile << "'"); - return nullptr; - } - - return createParticipant(participant_att, listen); -} - -Participant* Domain::createParticipant( - const eprosima::fastrtps::ParticipantAttributes& att, - ParticipantListener* listen) -{ - // If the user is not using XML and the environment variable is not set, this is going to be called always - if (!default_xml_profiles_loaded && SystemInfo::get_environment_file().empty()) - { - SystemInfo::set_environment_file(); - } - - Participant* pubsubpar = new Participant(); - ParticipantImpl* pspartimpl = new ParticipantImpl(att, pubsubpar, listen); - - // If DEFAULT_ROS2_MASTER_URI is specified then try to create default client if - // that already exists. - RTPSParticipant* part = RTPSDomainImpl::clientServerEnvironmentCreationOverride( - att.domainId, - false, - att.rtps, - &pspartimpl->m_rtps_listener); - - if (part == nullptr) - { - // Creation procedure without enable - part = RTPSDomain::createParticipant(att.domainId, false, att.rtps, &pspartimpl->m_rtps_listener); - } - - if (part == nullptr) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Problem creating RTPSParticipant"); - delete pspartimpl; - return nullptr; - } - - pspartimpl->mp_rtpsParticipant = part; - t_p_Participant pubsubpair; - pubsubpair.first = pubsubpar; - pubsubpair.second = pspartimpl; - - { - std::lock_guard guard(m_mutex); - m_participants.push_back(pubsubpair); - } - - // Enable participant - part->enable(); - - return pubsubpar; -} - -void Domain::getDefaultParticipantAttributes( - ParticipantAttributes& participant_attributes) -{ - if (false == default_xml_profiles_loaded) - { - SystemInfo::set_environment_file(); - XMLProfileManager::loadDefaultXMLFile(); - default_xml_profiles_loaded = true; - } - - return XMLProfileManager::getDefaultParticipantAttributes(participant_attributes); -} - -Publisher* Domain::createPublisher( - Participant* part, - const std::string& publisher_profile, - PublisherListener* listen) -{ - PublisherAttributes publisher_att; - if ( XMLP_ret::XML_ERROR == XMLProfileManager::fillPublisherAttributes(publisher_profile, publisher_att)) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "Problem loading profile '" << publisher_profile << "'"); - return nullptr; - } - - return createPublisher(part, publisher_att, listen); -} - -Publisher* Domain::createPublisher( - Participant* part, - const PublisherAttributes& att, - PublisherListener* listen) -{ - std::lock_guard guard(m_mutex); - for (auto it = m_participants.begin(); it != m_participants.end(); ++it) - { - if (it->second->getGuid() == part->getGuid()) - { - return part->mp_impl->createPublisher(att, listen); - } - } - //TODO MOSTRAR MENSAJE DE ERROR WARNING y COMPROBAR QUE EL PUNTERO QUE ME PASA NO ES NULL - return nullptr; -} - -void Domain::getDefaultPublisherAttributes( - PublisherAttributes& publisher_attributes) -{ - if (false == default_xml_profiles_loaded) - { - SystemInfo::set_environment_file(); - XMLProfileManager::loadDefaultXMLFile(); - default_xml_profiles_loaded = true; - } - - return XMLProfileManager::getDefaultPublisherAttributes(publisher_attributes); -} - -void Domain::getDefaultSubscriberAttributes( - SubscriberAttributes& subscriber_attributes) -{ - if (false == default_xml_profiles_loaded) - { - SystemInfo::set_environment_file(); - XMLProfileManager::loadDefaultXMLFile(); - default_xml_profiles_loaded = true; - } - - return XMLProfileManager::getDefaultSubscriberAttributes(subscriber_attributes); -} - -Subscriber* Domain::createSubscriber( - Participant* part, - const std::string& subscriber_profile, - SubscriberListener* listen) -{ - SubscriberAttributes subscriber_att; - if ( XMLP_ret::XML_ERROR == XMLProfileManager::fillSubscriberAttributes(subscriber_profile, subscriber_att)) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "Problem loading profile '" << subscriber_profile << "'"); - return nullptr; - } - - return createSubscriber(part, subscriber_att, listen); -} - -Subscriber* Domain::createSubscriber( - Participant* part, - const SubscriberAttributes& att, - SubscriberListener* listen) -{ - std::lock_guard guard(m_mutex); - for (auto it = m_participants.begin(); it != m_participants.end(); ++it) - { - if (it->second->getGuid() == part->getGuid()) - { - return part->mp_impl->createSubscriber(att, listen); - } - } - return nullptr; -} - -bool Domain::getRegisteredType( - Participant* part, - const char* typeName, - fastdds::dds::TopicDataType** type) -{ - std::lock_guard guard(m_mutex); - for (auto it = m_participants.begin(); it != m_participants.end(); ++it) - { - if (it->second->getGuid() == part->getGuid()) - { - return part->mp_impl->getRegisteredType(typeName, type); - } - } - return false; -} - -bool Domain::registerType( - Participant* part, - fastdds::dds::TopicDataType* type) -{ - std::lock_guard guard(m_mutex); - //TODO El registro debería hacerse de manera que no tengamos un objeto del usuario sino que tengamos un objeto TopicDataTYpe propio para que no - //haya problemas si el usuario lo destruye antes de tiempo. - for (auto it = m_participants.begin(); it != m_participants.end(); ++it) - { - if (it->second->getGuid() == part->getGuid()) - { - return part->mp_impl->registerType(type); - } - } - return false; -} - -bool Domain::registerDynamicType( - Participant* part, - types::DynamicPubSubType* type) -{ - using namespace eprosima::fastrtps::types; - TypeObjectFactory* typeFactory = TypeObjectFactory::get_instance(); - - const TypeIdentifier* type_id_min = typeFactory->get_type_identifier(type->getName()); - - if (type_id_min == nullptr) - { - DynamicTypeBuilderFactory* dynFactory = DynamicTypeBuilderFactory::get_instance(); - std::map membersMap; - type->GetDynamicType()->get_all_members(membersMap); - std::vector members; - for (auto it : membersMap) - { - members.push_back(it.second->get_descriptor()); - } - TypeObject typeObj; - dynFactory->build_type_object(type->GetDynamicType()->get_type_descriptor(), typeObj, &members); - // Minimal too - dynFactory->build_type_object(type->GetDynamicType()->get_type_descriptor(), typeObj, &members, false); - const TypeIdentifier* type_id2 = typeFactory->get_type_identifier(type->getName()); - const TypeObject* type_obj = typeFactory->get_type_object(type->getName()); - if (type_id2 == nullptr) - { - EPROSIMA_LOG_ERROR(DYN_TYPES, "Cannot register dynamic type " << type->getName()); - } - else - { - typeFactory->add_type_object(type->getName(), type_id2, type_obj); - - // Complete, just to make sure it is generated - const TypeIdentifier* type_id_complete = typeFactory->get_type_identifier(type->getName(), true); - const TypeObject* type_obj_complete = typeFactory->get_type_object(type->getName(), true); - typeFactory->add_type_object(type->getName(), type_id_complete, type_obj_complete); // Add complete - } - } - return registerType(part, type); -} - -bool Domain::unregisterType( - Participant* part, - const char* typeName) -{ - //TODO El registro debería hacerse de manera que no tengamos un objeto del usuario sino que tengamos un objeto TopicDataTYpe propio para que no - //haya problemas si el usuario lo destruye antes de tiempo. - std::lock_guard guard(m_mutex); - for (auto it = m_participants.begin(); it != m_participants.end(); ++it) - { - if (it->second->getGuid() == part->getGuid()) - { - return part->mp_impl->unregisterType(typeName); - } - } - return true; -} - -bool Domain::loadXMLProfilesFile( - const std::string& xml_profile_file) -{ - if (false == default_xml_profiles_loaded) - { - SystemInfo::set_environment_file(); - XMLProfileManager::loadDefaultXMLFile(); - default_xml_profiles_loaded = true; - } - - if ( XMLP_ret::XML_ERROR == XMLProfileManager::loadXMLFile(xml_profile_file)) - { - EPROSIMA_LOG_ERROR(DOMAIN, "Problem loading XML file '" << xml_profile_file << "'"); - return false; - } - return true; -} - -bool Domain::loadXMLProfilesString( - const char* data, - size_t length) -{ - if (false == default_xml_profiles_loaded) - { - XMLProfileManager::loadDefaultXMLFile(); - default_xml_profiles_loaded = true; - } - - if ( XMLP_ret::XML_ERROR == XMLProfileManager::loadXMLString(data, length)) - { - EPROSIMA_LOG_ERROR(DOMAIN, "Problem loading XML string"); - return false; - } - return true; -} - -} // namespace fastrtps -} // namespace eprosima diff --git a/src/cpp/fastrtps_deprecated/participant/Participant.cpp b/src/cpp/fastrtps_deprecated/participant/Participant.cpp deleted file mode 100644 index fcad54e90fa..00000000000 --- a/src/cpp/fastrtps_deprecated/participant/Participant.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file Participant.cpp - * - */ - -#include - -#include - -using namespace eprosima::fastrtps; -using namespace eprosima::fastrtps::rtps; - -Participant::Participant() - : mp_impl(nullptr) -{ -} - -Participant::~Participant() -{ - // TODO Auto-generated destructor stub -} - -const GUID_t& Participant::getGuid() const -{ - return mp_impl->getGuid(); -} - -const ParticipantAttributes& Participant::getAttributes() const -{ - return mp_impl->getAttributes(); -} - -bool Participant::newRemoteEndpointDiscovered( - const GUID_t& partguid, - uint16_t endpointId, - EndpointKind_t kind) -{ - return mp_impl->newRemoteEndpointDiscovered(partguid, endpointId, kind); -} - -std::vector Participant::getParticipantNames() const -{ - return mp_impl->getParticipantNames(); -} - -void Participant::assert_liveliness() -{ - mp_impl->assert_liveliness(); -} - -ResourceEvent& Participant::get_resource_event() const -{ - return mp_impl->get_resource_event(); -} diff --git a/src/cpp/fastrtps_deprecated/participant/ParticipantImpl.cpp b/src/cpp/fastrtps_deprecated/participant/ParticipantImpl.cpp deleted file mode 100644 index 33d865364aa..00000000000 --- a/src/cpp/fastrtps_deprecated/participant/ParticipantImpl.cpp +++ /dev/null @@ -1,555 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file ParticipantImpl.cpp - * - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace eprosima::fastrtps; -using namespace eprosima::fastrtps::rtps; - -using eprosima::fastdds::dds::TopicDataType; - -ParticipantImpl::ParticipantImpl( - const ParticipantAttributes& patt, - Participant* pspart, - ParticipantListener* listen) - : m_att(patt) - , mp_rtpsParticipant(nullptr) - , mp_participant(pspart) - , mp_listener(listen) -#pragma warning (disable : 4355 ) - , m_rtps_listener(this) -{ - mp_participant->mp_impl = this; -} - -ParticipantImpl::~ParticipantImpl() -{ - while (m_publishers.size() > 0) - { - this->removePublisher(m_publishers.begin()->first); - } - while (m_subscribers.size() > 0) - { - this->removeSubscriber(m_subscribers.begin()->first); - } - - if (this->mp_rtpsParticipant != nullptr) - { - RTPSDomain::removeRTPSParticipant(this->mp_rtpsParticipant); - } - - delete(mp_participant); -} - -bool ParticipantImpl::removePublisher( - Publisher* pub) -{ - for (auto pit = this->m_publishers.begin(); pit != m_publishers.end(); ++pit) - { - if (pit->second->getGuid() == pub->getGuid()) - { - delete(pit->second); - m_publishers.erase(pit); - return true; - } - } - return false; -} - -bool ParticipantImpl::removeSubscriber( - Subscriber* sub) -{ - for (auto sit = m_subscribers.begin(); sit != m_subscribers.end(); ++sit) - { - if (sit->second->getGuid() == sub->getGuid()) - { - delete(sit->second); - m_subscribers.erase(sit); - return true; - } - } - return false; -} - -const GUID_t& ParticipantImpl::getGuid() const -{ - return this->mp_rtpsParticipant->getGuid(); -} - -Publisher* ParticipantImpl::createPublisher( - const PublisherAttributes& att, - PublisherListener* listen) -{ - EPROSIMA_LOG_INFO(PARTICIPANT, "CREATING PUBLISHER IN TOPIC: " << att.topic.getTopicName()); - //Look for the correct type registration - - TopicDataType* p_type = nullptr; - - /// Preconditions - // Check the type was registered. - if (!getRegisteredType(att.topic.getTopicDataType().c_str(), &p_type)) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Type : " << att.topic.getTopicDataType() << " Not Registered"); - return nullptr; - } - // Check the type supports keys. - if (att.topic.topicKind == WITH_KEY && !p_type->m_isGetKeyDefined) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Keyed Topic needs getKey function"); - return nullptr; - } - - if (m_att.rtps.builtin.discovery_config.use_STATIC_EndpointDiscoveryProtocol) - { - if (att.getUserDefinedID() <= 0) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Static EDP requires user defined Id"); - return nullptr; - } - } - if (!att.unicastLocatorList.isValid()) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Unicast Locator List for Publisher contains invalid Locator"); - return nullptr; - } - if (!att.multicastLocatorList.isValid()) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, " Multicast Locator List for Publisher contains invalid Locator"); - return nullptr; - } - if (!att.remoteLocatorList.isValid()) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Remote Locator List for Publisher contains invalid Locator"); - return nullptr; - } - if (!att.qos.checkQos() || !att.topic.checkQos()) - { - return nullptr; - } - - //TODO CONSTRUIR LA IMPLEMENTACION DENTRO DEL OBJETO DEL USUARIO. - PublisherImpl* pubimpl = new PublisherImpl(this, p_type, att, listen); - Publisher* pub = new Publisher(pubimpl); - pubimpl->mp_userPublisher = pub; - pubimpl->mp_rtpsParticipant = this->mp_rtpsParticipant; - - WriterAttributes watt; - watt.throughputController = att.throughputController; - watt.endpoint.durabilityKind = att.qos.m_durability.durabilityKind(); - watt.endpoint.endpointKind = WRITER; - watt.endpoint.multicastLocatorList = att.multicastLocatorList; - watt.endpoint.reliabilityKind = att.qos.m_reliability.kind == RELIABLE_RELIABILITY_QOS ? RELIABLE : BEST_EFFORT; - watt.endpoint.topicKind = att.topic.topicKind; - watt.endpoint.unicastLocatorList = att.unicastLocatorList; - watt.endpoint.remoteLocatorList = att.remoteLocatorList; - watt.mode = att.qos.m_publishMode.kind == - eprosima::fastrtps::SYNCHRONOUS_PUBLISH_MODE ? SYNCHRONOUS_WRITER : ASYNCHRONOUS_WRITER; - watt.endpoint.properties = att.properties; - watt.flow_controller_name = att.qos.m_publishMode.flow_controller_name; - if (att.getEntityID() > 0) - { - watt.endpoint.setEntityID((uint8_t)att.getEntityID()); - } - if (att.getUserDefinedID() > 0) - { - watt.endpoint.setUserDefinedID((uint8_t)att.getUserDefinedID()); - } - watt.times = att.times; - watt.liveliness_kind = att.qos.m_liveliness.kind; - watt.liveliness_lease_duration = att.qos.m_liveliness.lease_duration; - watt.liveliness_announcement_period = att.qos.m_liveliness.announcement_period; - watt.matched_readers_allocation = att.matched_subscriber_allocation; - watt.disable_heartbeat_piggyback = att.qos.disable_heartbeat_piggyback; - - // TODO(Ricardo) Remove in future - // Insert topic_name and partitions - Property property; - property.name("topic_name"); - property.value(att.topic.getTopicName().c_str()); - watt.endpoint.properties.properties().push_back(std::move(property)); - if (att.qos.m_partition.names().size() > 0) - { - property.name("partitions"); - std::string partitions; - bool is_first_partition = true; - for (auto partition : att.qos.m_partition.names()) - { - partitions += (is_first_partition ? "" : ";") + partition; - is_first_partition = false; - } - property.value(std::move(partitions)); - watt.endpoint.properties.properties().push_back(std::move(property)); - } - if (att.qos.m_disablePositiveACKs.enabled && - att.qos.m_disablePositiveACKs.duration != c_TimeInfinite) - { - watt.disable_positive_acks = true; - watt.keep_duration = att.qos.m_disablePositiveACKs.duration; - } - - RTPSWriter* writer = RTPSDomain::createRTPSWriter( - this->mp_rtpsParticipant, - watt, pubimpl->payload_pool(), - (WriterHistory*)&pubimpl->m_history, - (WriterListener*)&pubimpl->m_writerListener); - if (writer == nullptr) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Problem creating associated Writer"); - delete(pubimpl); - return nullptr; - } - pubimpl->mp_writer = writer; - - // In case it has been loaded from the persistence DB, rebuild instances on history - pubimpl->m_history.rebuild_instances(); - if (att.qos.m_lifespan.duration != c_TimeInfinite) - { - if (pubimpl->lifespan_expired()) - { - pubimpl->lifespan_timer_->restart_timer(); - } - } - - //SAVE THE PUBLISHER PAIR - t_p_PublisherPair pubpair; - pubpair.first = pub; - pubpair.second = pubimpl; - m_publishers.push_back(pubpair); - - //REGISTER THE WRITER - this->mp_rtpsParticipant->registerWriter(writer, att.topic, att.qos); - - return pub; -} - -std::vector ParticipantImpl::getParticipantNames() const -{ - return mp_rtpsParticipant->getParticipantNames(); -} - -Subscriber* ParticipantImpl::createSubscriber( - const SubscriberAttributes& att, - SubscriberListener* listen) -{ - EPROSIMA_LOG_INFO(PARTICIPANT, "CREATING SUBSCRIBER IN TOPIC: " << att.topic.getTopicName()); - //Look for the correct type registration - - TopicDataType* p_type = nullptr; - - if (!getRegisteredType(att.topic.getTopicDataType().c_str(), &p_type)) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Type : " << att.topic.getTopicDataType() << " Not Registered"); - return nullptr; - } - if (att.topic.topicKind == WITH_KEY && !p_type->m_isGetKeyDefined) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Keyed Topic needs getKey function"); - return nullptr; - } - if (m_att.rtps.builtin.discovery_config.use_STATIC_EndpointDiscoveryProtocol) - { - if (att.getUserDefinedID() <= 0) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Static EDP requires user defined Id"); - return nullptr; - } - } - if (!att.unicastLocatorList.isValid()) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Unicast Locator List for Subscriber contains invalid Locator"); - return nullptr; - } - if (!att.multicastLocatorList.isValid()) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, " Multicast Locator List for Subscriber contains invalid Locator"); - return nullptr; - } - if (!att.remoteLocatorList.isValid()) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Output Locator List for Subscriber contains invalid Locator"); - return nullptr; - } - if (!att.qos.checkQos() || !att.topic.checkQos()) - { - return nullptr; - } - - SubscriberImpl* subimpl = new SubscriberImpl(this, p_type, att, listen); - Subscriber* sub = new Subscriber(subimpl); - subimpl->mp_userSubscriber = sub; - subimpl->mp_rtpsParticipant = this->mp_rtpsParticipant; - - ReaderAttributes ratt; - ratt.endpoint.durabilityKind = att.qos.m_durability.durabilityKind(); - ratt.endpoint.endpointKind = READER; - ratt.endpoint.multicastLocatorList = att.multicastLocatorList; - ratt.endpoint.reliabilityKind = att.qos.m_reliability.kind == RELIABLE_RELIABILITY_QOS ? RELIABLE : BEST_EFFORT; - ratt.endpoint.topicKind = att.topic.topicKind; - ratt.endpoint.unicastLocatorList = att.unicastLocatorList; - ratt.endpoint.remoteLocatorList = att.remoteLocatorList; - ratt.expectsInlineQos = att.expectsInlineQos; - ratt.endpoint.properties = att.properties; - if (att.getEntityID() > 0) - { - ratt.endpoint.setEntityID((uint8_t)att.getEntityID()); - } - if (att.getUserDefinedID() > 0) - { - ratt.endpoint.setUserDefinedID((uint8_t)att.getUserDefinedID()); - } - ratt.times = att.times; - ratt.matched_writers_allocation = att.matched_publisher_allocation; - ratt.liveliness_kind_ = att.qos.m_liveliness.kind; - ratt.liveliness_lease_duration = att.qos.m_liveliness.lease_duration; - - // TODO(Ricardo) Remove in future - // Insert topic_name and partitions - Property property; - property.name("topic_name"); - property.value(att.topic.getTopicName().c_str()); - ratt.endpoint.properties.properties().push_back(std::move(property)); - if (att.qos.m_partition.names().size() > 0) - { - property.name("partitions"); - std::string partitions; - bool is_first_partition = true; - for (auto partition : att.qos.m_partition.names()) - { - partitions += (is_first_partition ? "" : ";") + partition; - is_first_partition = false; - } - property.value(std::move(partitions)); - ratt.endpoint.properties.properties().push_back(std::move(property)); - } - if (att.qos.m_disablePositiveACKs.enabled) - { - ratt.disable_positive_acks = true; - } - - RTPSReader* reader = RTPSDomain::createRTPSReader(this->mp_rtpsParticipant, - ratt, subimpl->payload_pool(), - (ReaderHistory*)&subimpl->m_history, - (ReaderListener*)&subimpl->m_readerListener); - if (reader == nullptr) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Problem creating associated Reader"); - delete(subimpl); - return nullptr; - } - subimpl->mp_reader = reader; - //SAVE THE PUBLICHER PAIR - t_p_SubscriberPair subpair; - subpair.first = sub; - subpair.second = subimpl; - m_subscribers.push_back(subpair); - - //REGISTER THE READER - this->mp_rtpsParticipant->registerReader(reader, att.topic, att.qos); - - return sub; -} - -bool ParticipantImpl::getRegisteredType( - const char* typeName, - TopicDataType** type) -{ - for (std::vector::iterator it = m_types.begin(); - it != m_types.end(); ++it) - { - if (strcmp((*it)->getName(), typeName) == 0) - { - *type = *it; - return true; - } - } - return false; -} - -bool ParticipantImpl::registerType( - TopicDataType* type) -{ - if (type->m_typeSize <= 0) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Registered Type must have maximum byte size > 0"); - return false; - } - const char* name = type->getName(); - if (strlen(name) <= 0) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Registered Type must have a name"); - return false; - } - for (auto ty = m_types.begin(); ty != m_types.end(); ++ty) - { - if (strcmp((*ty)->getName(), type->getName()) == 0) - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Type with the same name already exists:" << type->getName()); - return false; - } - } - m_types.push_back(type); - EPROSIMA_LOG_INFO(PARTICIPANT, "Type " << type->getName() << " registered."); - return true; -} - -bool ParticipantImpl::unregisterType( - const char* typeName) -{ - bool retValue = false; - std::vector::iterator typeit; - - for (typeit = m_types.begin(); typeit != m_types.end(); ++typeit) - { - if (strcmp((*typeit)->getName(), typeName) == 0) - { - break; - } - } - - if (typeit != m_types.end()) - { - bool inUse = false; - - for (auto sit = m_subscribers.begin(); !inUse && sit != m_subscribers.end(); ++sit) - { - if (strcmp(sit->second->getType()->getName(), typeName) == 0) - { - inUse = true; - } - } - - for (auto pit = m_publishers.begin(); pit != m_publishers.end(); ++pit) - { - if (strcmp(pit->second->getType()->getName(), typeName) == 0) - { - inUse = true; - } - } - - if (!inUse) - { - m_types.erase(typeit); - retValue = true; - } - } - - return retValue; -} - -void ParticipantImpl::MyRTPSParticipantListener::onParticipantDiscovery( - RTPSParticipant*, - rtps::ParticipantDiscoveryInfo&& info) -{ - if (this->mp_participantimpl->mp_listener != nullptr) - { - this->mp_participantimpl->mp_listener->onParticipantDiscovery(mp_participantimpl->mp_participant, std::move( - info)); - } -} - -#if HAVE_SECURITY -void ParticipantImpl::MyRTPSParticipantListener::onParticipantAuthentication( - RTPSParticipant*, - ParticipantAuthenticationInfo&& info) -{ - if (this->mp_participantimpl->mp_listener != nullptr) - { - this->mp_participantimpl->mp_listener->onParticipantAuthentication(mp_participantimpl->mp_participant, std::move( - info)); - } -} - -#endif // if HAVE_SECURITY - -void ParticipantImpl::MyRTPSParticipantListener::onReaderDiscovery( - RTPSParticipant*, - rtps::ReaderDiscoveryInfo&& info) -{ - if (this->mp_participantimpl->mp_listener != nullptr) - { - this->mp_participantimpl->mp_listener->onSubscriberDiscovery(mp_participantimpl->mp_participant, - std::move(info)); - } -} - -void ParticipantImpl::MyRTPSParticipantListener::onWriterDiscovery( - RTPSParticipant*, - rtps::WriterDiscoveryInfo&& info) -{ - if (this->mp_participantimpl->mp_listener != nullptr) - { - this->mp_participantimpl->mp_listener->onPublisherDiscovery(mp_participantimpl->mp_participant, - std::move(info)); - } -} - -bool ParticipantImpl::newRemoteEndpointDiscovered( - const GUID_t& partguid, - uint16_t endpointId, - EndpointKind_t kind) -{ - if (kind == WRITER) - { - return this->mp_rtpsParticipant->newRemoteWriterDiscovered(partguid, endpointId); - } - else - { - return this->mp_rtpsParticipant->newRemoteReaderDiscovered(partguid, endpointId); - } -} - -ResourceEvent& ParticipantImpl::get_resource_event() const -{ - return mp_rtpsParticipant->get_resource_event(); -} - -void ParticipantImpl::assert_liveliness() -{ - if (mp_rtpsParticipant->wlp() != nullptr) - { - mp_rtpsParticipant->wlp()->assert_liveliness_manual_by_participant(); - } - else - { - EPROSIMA_LOG_ERROR(PARTICIPANT, "Invalid WLP, cannot assert liveliness of participant"); - } -} - -const Participant* ParticipantImpl::get_participant() const -{ - return mp_participant; -} diff --git a/src/cpp/fastrtps_deprecated/participant/ParticipantImpl.h b/src/cpp/fastrtps_deprecated/participant/ParticipantImpl.h deleted file mode 100644 index a0165ac0c75..00000000000 --- a/src/cpp/fastrtps_deprecated/participant/ParticipantImpl.h +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file ParticipantImpl.h - * - */ - -#ifndef PARTICIPANTIMPL_H_ -#define PARTICIPANTIMPL_H_ -#ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#include -#include -#include -#include -#include - -namespace eprosima { - -namespace fastrtps { - -namespace rtps { -class RTPSParticipant; -class WriterProxyData; -class ReaderProxyData; -} // namespace rtps - - - -class Participant; -class ParticipantListener; - -class Publisher; -class PublisherImpl; -class PublisherAttributes; -class PublisherListener; -class Subscriber; -class SubscriberImpl; -class SubscriberAttributes; -class SubscriberListener; - - -/** - * This is the implementation class of the Participant. - * @ingroup FASTRTPS_MODULE - */ -class ParticipantImpl -{ - friend class Domain; - typedef std::pair t_p_PublisherPair; - typedef std::pair t_p_SubscriberPair; - typedef std::vector t_v_PublisherPairs; - typedef std::vector t_v_SubscriberPairs; - -private: - - ParticipantImpl( - const ParticipantAttributes& patt, - Participant* pspart, - ParticipantListener* listen = nullptr); - virtual ~ParticipantImpl(); - -public: - - /** - * Register a type in this participant. - * @param type Pointer to the TopicDatType. - * @return True if registered. - */ - bool registerType( - fastdds::dds::TopicDataType* type); - - /** - * Unregister a type in this participant. - * @param typeName Name of the type - * @return True if unregistered. - */ - bool unregisterType( - const char* typeName); - - /** - * Create a Publisher in this Participant. - * @param att Attributes of the Publisher. - * @param listen Pointer to the listener. - * @return Pointer to the created Publisher. - */ - Publisher* createPublisher( - const PublisherAttributes& att, - PublisherListener* listen = nullptr); - - /** - * Create a Subscriber in this Participant. - * @param att Attributes of the Subscriber - * @param listen Pointer to the listener. - * @return Pointer to the created Subscriber. - */ - Subscriber* createSubscriber( - const SubscriberAttributes& att, - SubscriberListener* listen = nullptr); - - /** - * Remove a Publisher from this participant. - * @param pub Pointer to the Publisher. - * @return True if correctly removed. - */ - bool removePublisher( - Publisher* pub); - - /** - * Remove a Subscriber from this participant. - * @param sub Pointer to the Subscriber. - * @return True if correctly removed. - */ - bool removeSubscriber( - Subscriber* sub); - - /** - * Get the GUID_t of the associated RTPSParticipant. - * @return GUID_t. - */ - const rtps::GUID_t& getGuid() const; - - /** - * Get the participant attributes - * @return Participant attributes - */ - inline const ParticipantAttributes& getAttributes() const - { - return m_att; - } - - std::pair getEDPReaders(); - - std::vector getParticipantNames() const; - - /** - * This method can be used when using a StaticEndpointDiscovery mechanism different that the one - * included in FastRTPS, for example when communicating with other implementations. - * It indicates the Participant that an Endpoint from the XML has been discovered and - * should be activated. - * @param partguid Participant GUID_t. - * @param userId User defined ID as shown in the XML file. - * @param kind EndpointKind (WRITER or READER) - * @return True if correctly found and activated. - */ - bool newRemoteEndpointDiscovered( - const rtps::GUID_t& partguid, - uint16_t userId, - rtps::EndpointKind_t kind); - - rtps::ResourceEvent& get_resource_event() const; - - /** - * @brief Asserts liveliness of manual by participant readers - */ - void assert_liveliness(); - - const Participant* get_participant() const; - - const rtps::RTPSParticipant* rtps_participant() const - { - return mp_rtpsParticipant; - } - - rtps::RTPSParticipant* rtps_participant() - { - return mp_rtpsParticipant; - } - -private: - - //!Participant Attributes - ParticipantAttributes m_att; - //!RTPSParticipant - rtps::RTPSParticipant* mp_rtpsParticipant; - //!Participant* - Participant* mp_participant; - //!Participant Listener - ParticipantListener* mp_listener; - //!Publisher Vector - t_v_PublisherPairs m_publishers; - //!Subscriber Vector - t_v_SubscriberPairs m_subscribers; - //!TOpicDatType vector - std::vector m_types; - - bool getRegisteredType( - const char* typeName, - fastdds::dds::TopicDataType** type); - - class MyRTPSParticipantListener : public rtps::RTPSParticipantListener - { - public: - - MyRTPSParticipantListener( - ParticipantImpl* impl) - : mp_participantimpl(impl) - { - } - - virtual ~MyRTPSParticipantListener() - { - } - - void onParticipantDiscovery( - rtps::RTPSParticipant* participant, - rtps::ParticipantDiscoveryInfo&& info) override; - -#if HAVE_SECURITY - void onParticipantAuthentication( - rtps::RTPSParticipant* participant, - rtps::ParticipantAuthenticationInfo&& info) override; -#endif // if HAVE_SECURITY - - void onReaderDiscovery( - rtps::RTPSParticipant* participant, - rtps::ReaderDiscoveryInfo&& info) override; - - void onWriterDiscovery( - rtps::RTPSParticipant* participant, - rtps::WriterDiscoveryInfo&& info) override; - - ParticipantImpl* mp_participantimpl; - - private: - - using rtps::RTPSParticipantListener::onParticipantDiscovery; - using rtps::RTPSParticipantListener::onReaderDiscovery; - using rtps::RTPSParticipantListener::onWriterDiscovery; - - } - m_rtps_listener; - -}; - -} /* namespace */ -} /* namespace eprosima */ -#endif // ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#endif /* PARTICIPANTIMPL_H_ */ diff --git a/src/cpp/fastrtps_deprecated/publisher/Publisher.cpp b/src/cpp/fastrtps_deprecated/publisher/Publisher.cpp deleted file mode 100644 index ba8b5fe877d..00000000000 --- a/src/cpp/fastrtps_deprecated/publisher/Publisher.cpp +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file Publisher.cpp - * - */ - -#include -#include -#include - -#include - -using namespace eprosima::fastrtps; -using namespace eprosima::fastrtps::rtps; - -Publisher::Publisher( - PublisherImpl* pimpl) - : mp_impl(pimpl) -{ - // TODO Auto-generated constructor stub -} - -Publisher::~Publisher() -{ - // TODO Auto-generated destructor stub -} - -bool Publisher::write( - void* Data) -{ - EPROSIMA_LOG_INFO(PUBLISHER, "Writing new data"); - return mp_impl->create_new_change(ALIVE, Data); -} - -bool Publisher::write( - void* Data, - WriteParams& wparams) -{ - EPROSIMA_LOG_INFO(PUBLISHER, "Writing new data with WriteParams"); - return mp_impl->create_new_change_with_params(ALIVE, Data, wparams); -} - -rtps::InstanceHandle_t Publisher::register_instance( - void* sample) -{ - return mp_impl->register_instance(sample); -} - -bool Publisher::dispose( - void* data, - const rtps::InstanceHandle_t& handle) -{ - EPROSIMA_LOG_INFO(PUBLISHER, "Disposing of Data"); - return mp_impl->unregister_instance(data, handle, true); -} - -bool Publisher::unregister_instance( - void* instance, - const rtps::InstanceHandle_t& handle) -{ - //Convert data to serialized Payload - return mp_impl->unregister_instance(instance, handle); -} - -bool Publisher::removeAllChange( - size_t* removed ) -{ - EPROSIMA_LOG_INFO(PUBLISHER, "Removing all data from history"); - return mp_impl->removeAllChange(removed); -} - -bool Publisher::wait_for_all_acked( - const eprosima::fastrtps::Duration_t& max_wait) -{ - EPROSIMA_LOG_INFO(PUBLISHER, "Waiting for all samples acknowledged"); - return mp_impl->wait_for_all_acked(max_wait); -} - -const GUID_t& Publisher::getGuid() -{ - return mp_impl->getGuid(); -} - -const PublisherAttributes& Publisher::getAttributes() const -{ - return mp_impl->getAttributes(); -} - -bool Publisher::updateAttributes( - const PublisherAttributes& att) -{ - return mp_impl->updateAttributes(att); -} - -void Publisher::get_offered_deadline_missed_status( - OfferedDeadlineMissedStatus& status) -{ - mp_impl->get_offered_deadline_missed_status(status); -} - -void Publisher::get_liveliness_lost_status( - LivelinessLostStatus& status) -{ - mp_impl->get_liveliness_lost_status(status); -} - -void Publisher::assert_liveliness() -{ - mp_impl->assert_liveliness(); -} - -void Publisher::get_sending_locators( - rtps::LocatorList_t& locators) const -{ - mp_impl->get_sending_locators(locators); -} diff --git a/src/cpp/fastrtps_deprecated/publisher/PublisherHistory.cpp b/src/cpp/fastrtps_deprecated/publisher/PublisherHistory.cpp deleted file mode 100644 index a29dd48ac9c..00000000000 --- a/src/cpp/fastrtps_deprecated/publisher/PublisherHistory.cpp +++ /dev/null @@ -1,520 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file PublisherHistory.cpp - * - */ -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace eprosima { -namespace fastrtps { - -using namespace rtps; - -static HistoryAttributes to_history_attributes( - const TopicAttributes& topic_att, - uint32_t payloadMaxSize, - MemoryManagementPolicy_t mempolicy) -{ - auto initial_samples = topic_att.resourceLimitsQos.allocated_samples; - auto max_samples = topic_att.resourceLimitsQos.max_samples; - auto extra_samples = topic_att.resourceLimitsQos.extra_samples; - - if (topic_att.historyQos.kind != KEEP_ALL_HISTORY_QOS) - { - max_samples = topic_att.historyQos.depth; - if (topic_att.getTopicKind() != NO_KEY) - { - max_samples *= topic_att.resourceLimitsQos.max_instances; - } - - initial_samples = std::min(initial_samples, max_samples); - } - - return HistoryAttributes(mempolicy, payloadMaxSize, initial_samples, max_samples, extra_samples); -} - -PublisherHistory::PublisherHistory( - const TopicAttributes& topic_att, - uint32_t payloadMaxSize, - MemoryManagementPolicy_t mempolicy) - : WriterHistory(to_history_attributes(topic_att, payloadMaxSize, mempolicy)) - , history_qos_(topic_att.historyQos) - , resource_limited_qos_(topic_att.resourceLimitsQos) - , topic_att_(topic_att) -{ - if (resource_limited_qos_.max_samples <= 0) - { - resource_limited_qos_.max_samples = std::numeric_limits::max(); - } - - if (resource_limited_qos_.max_instances <= 0) - { - resource_limited_qos_.max_instances = std::numeric_limits::max(); - } - - if (resource_limited_qos_.max_samples_per_instance <= 0) - { - resource_limited_qos_.max_samples_per_instance = std::numeric_limits::max(); - } -} - -PublisherHistory::~PublisherHistory() -{ -} - -void PublisherHistory::rebuild_instances() -{ - if (topic_att_.getTopicKind() == WITH_KEY) - { - for (CacheChange_t* change : m_changes) - { - t_m_Inst_Caches::iterator vit; - if (find_or_add_key(change->instanceHandle, &vit)) - { - vit->second.cache_changes.push_back(change); - } - } - } -} - -bool PublisherHistory::register_instance( - const InstanceHandle_t& instance_handle, - std::unique_lock&, - const std::chrono::time_point&) -{ - /// Preconditions - if (topic_att_.getTopicKind() == NO_KEY) - { - return false; - } - - t_m_Inst_Caches::iterator vit; - return find_or_add_key(instance_handle, &vit); -} - -bool PublisherHistory::prepare_change( - CacheChange_t* change, - std::unique_lock& lock, - const std::chrono::time_point& max_blocking_time) -{ - if (m_isHistoryFull) - { - bool ret = false; - - if (history_qos_.kind == KEEP_ALL_HISTORY_QOS) - { - ret = this->mp_writer->try_remove_change(max_blocking_time, lock); - } - else if (history_qos_.kind == KEEP_LAST_HISTORY_QOS) - { - ret = this->remove_min_change(); - } - - if (!ret) - { - EPROSIMA_LOG_WARNING(RTPS_HISTORY, - "Attempting to add Data to Full WriterCache: " << topic_att_.getTopicDataType()); - return false; - } - } - - assert(!m_isHistoryFull); - - // For NO_KEY we can directly add the change - bool add = (topic_att_.getTopicKind() == NO_KEY); - if (topic_att_.getTopicKind() == WITH_KEY) - { - t_m_Inst_Caches::iterator vit; - - // For WITH_KEY, we take into account the limits on the instance - // In case we wait for a sequence to be acknowledged, we try several times - // until we reach the max blocking timepoint - while (!add) - { - // We should have the instance - if (!find_or_add_key(change->instanceHandle, &vit)) - { - break; - } - - if (history_qos_.kind == KEEP_LAST_HISTORY_QOS) - { - if (vit->second.cache_changes.size() < static_cast(history_qos_.depth)) - { - add = true; - } - else - { - add = remove_change_pub(vit->second.cache_changes.front()); - } - } - else if (history_qos_.kind == KEEP_ALL_HISTORY_QOS) - { - if (vit->second.cache_changes.size() < - static_cast(resource_limited_qos_.max_samples_per_instance)) - { - add = true; - } - else - { - SequenceNumber_t seq_to_remove = vit->second.cache_changes.front()->sequenceNumber; - if (!mp_writer->wait_for_acknowledgement(seq_to_remove, max_blocking_time, lock)) - { - // Timeout waiting. Will not add change to history. - break; - } - - // vit may have been invalidated - if (!find_or_add_key(change->instanceHandle, &vit)) - { - break; - } - - // If the change we were trying to remove was already removed, try again - if (vit->second.cache_changes.empty() || - vit->second.cache_changes.front()->sequenceNumber != seq_to_remove) - { - continue; - } - - // Remove change if still present - add = remove_change_pub(vit->second.cache_changes.front()); - } - } - } - - if (add) - { - vit->second.cache_changes.push_back(change); - } - } - - return add; -} - -bool PublisherHistory::add_pub_change( - CacheChange_t* change, - WriteParams& wparams, - std::unique_lock& lock, - const std::chrono::time_point& max_blocking_time) -{ - bool returnedValue = false; - bool add = prepare_change(change, lock, max_blocking_time); - - if (add) - { -#if HAVE_STRICT_REALTIME - if (this->add_change_(change, wparams, max_blocking_time)) -#else - if (this->add_change_(change, wparams)) -#endif // if HAVE_STRICT_REALTIME - { - EPROSIMA_LOG_INFO(RTPS_HISTORY, - topic_att_.getTopicDataType() - << " Change " << change->sequenceNumber << " added with key: " << change->instanceHandle - << " and " << change->serializedPayload.length << " bytes"); - returnedValue = true; - } - } - - return returnedValue; -} - -bool PublisherHistory::find_or_add_key( - const InstanceHandle_t& instance_handle, - t_m_Inst_Caches::iterator* vit_out) -{ - t_m_Inst_Caches::iterator vit; - vit = keyed_changes_.find(instance_handle); - if (vit != keyed_changes_.end()) - { - *vit_out = vit; - return true; - } - - if (static_cast(keyed_changes_.size()) < resource_limited_qos_.max_instances) - { - *vit_out = keyed_changes_.insert(std::make_pair(instance_handle, KeyedChanges())).first; - return true; - } - - return false; -} - -bool PublisherHistory::removeAllChange( - size_t* removed) -{ - - size_t rem = 0; - std::lock_guard guard(*this->mp_mutex); - - while (m_changes.size() > 0) - { - if (remove_change_pub(m_changes.front())) - { - ++rem; - } - else - { - break; - } - } - if (removed != nullptr) - { - *removed = rem; - } - if (rem > 0) - { - return true; - } - return false; -} - -bool PublisherHistory::removeMinChange() -{ - if (mp_writer == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(RTPS_HISTORY, "You need to create a Writer with this History before using it"); - return false; - } - - std::lock_guard guard(*this->mp_mutex); - if (m_changes.size() > 0) - { - return remove_change_pub(m_changes.front()); - } - return false; -} - -bool PublisherHistory::remove_change_pub( - CacheChange_t* change) -{ - if (mp_writer == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(RTPS_HISTORY, "You need to create a Writer with this History before using it"); - return false; - } - - std::lock_guard guard(*this->mp_mutex); - if (topic_att_.getTopicKind() == NO_KEY) - { - if (remove_change(change)) - { - m_isHistoryFull = false; - return true; - } - - return false; - } - else - { - t_m_Inst_Caches::iterator vit; - if (!this->find_or_add_key(change->instanceHandle, &vit)) - { - return false; - } - - for (auto chit = vit->second.cache_changes.begin(); chit != vit->second.cache_changes.end(); ++chit) - { - if (((*chit)->sequenceNumber == change->sequenceNumber) && ((*chit)->writerGUID == change->writerGUID)) - { - if (remove_change(change)) - { - vit->second.cache_changes.erase(chit); - m_isHistoryFull = false; - return true; - } - } - } - EPROSIMA_LOG_ERROR(PUBLISHER, "Change not found, something is wrong"); - } - return false; -} - -bool PublisherHistory::remove_change_g( - CacheChange_t* a_change) -{ - return remove_change_pub(a_change); -} - -bool PublisherHistory::remove_change_g( - CacheChange_t* a_change, - const std::chrono::time_point&) -{ - return remove_change_pub(a_change); -} - -bool PublisherHistory::remove_instance_changes( - const rtps::InstanceHandle_t& handle, - const rtps::SequenceNumber_t& seq_up_to) -{ - if (mp_writer == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(RTPS_HISTORY, "You need to create a Writer with this History before using it"); - return false; - } - - if (topic_att_.getTopicKind() == NO_KEY) - { - EPROSIMA_LOG_ERROR(RTPS_HISTORY, "Cannot be removed instance changes of a NO_KEY DataType"); - return false; - } - - std::lock_guard guard(*this->mp_mutex); - t_m_Inst_Caches::iterator vit; - vit = keyed_changes_.find(handle); - if (vit == keyed_changes_.end()) - { - return false; - } - - auto chit = vit->second.cache_changes.begin(); - - for (; chit != vit->second.cache_changes.end() && (*chit)->sequenceNumber <= seq_up_to; ++chit) - { - if (remove_change(*chit)) - { - m_isHistoryFull = false; - } - } - - vit->second.cache_changes.erase(vit->second.cache_changes.begin(), chit); - - if (vit->second.cache_changes.empty()) - { - keyed_changes_.erase(vit); - } - - return true; -} - -bool PublisherHistory::set_next_deadline( - const InstanceHandle_t& handle, - const std::chrono::steady_clock::time_point& next_deadline_us) -{ - if (mp_writer == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(RTPS_HISTORY, "You need to create a Writer with this History before using it"); - return false; - } - std::lock_guard guard(*this->mp_mutex); - - if (topic_att_.getTopicKind() == NO_KEY) - { - next_deadline_us_ = next_deadline_us; - return true; - } - else if (topic_att_.getTopicKind() == WITH_KEY) - { - if (keyed_changes_.find(handle) == keyed_changes_.end()) - { - return false; - } - - keyed_changes_[handle].next_deadline_us = next_deadline_us; - return true; - } - - return false; -} - -bool PublisherHistory::get_next_deadline( - InstanceHandle_t& handle, - std::chrono::steady_clock::time_point& next_deadline_us) -{ - if (mp_writer == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(RTPS_HISTORY, "You need to create a Writer with this History before using it"); - return false; - } - std::lock_guard guard(*this->mp_mutex); - - if (topic_att_.getTopicKind() == WITH_KEY) - { - auto min = std::min_element( - keyed_changes_.begin(), - keyed_changes_.end(), - []( - const std::pair& lhs, - const std::pair& rhs) - { - return lhs.second.next_deadline_us < rhs.second.next_deadline_us; - }); - - handle = min->first; - next_deadline_us = min->second.next_deadline_us; - return true; - } - else if (topic_att_.getTopicKind() == NO_KEY) - { - next_deadline_us = next_deadline_us_; - return true; - } - - return false; -} - -bool PublisherHistory::is_key_registered( - const InstanceHandle_t& handle) -{ - if (mp_writer == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(RTPS_HISTORY, "You need to create a Writer with this History before using it"); - return false; - } - std::lock_guard guard(*this->mp_mutex); - t_m_Inst_Caches::iterator vit; - vit = keyed_changes_.find(handle); - return (vit != keyed_changes_.end() && - (vit->second.cache_changes.empty() || - (NOT_ALIVE_UNREGISTERED != vit->second.cache_changes.back()->kind && - NOT_ALIVE_DISPOSED_UNREGISTERED != vit->second.cache_changes.back()->kind - ) - ) - ); -} - -bool PublisherHistory::wait_for_acknowledgement_last_change( - const InstanceHandle_t& handle, - std::unique_lock& lock, - const std::chrono::time_point& max_blocking_time) -{ - if (WITH_KEY == topic_att_.getTopicKind()) - { - // Find the instance - t_m_Inst_Caches::iterator vit = keyed_changes_.find(handle); - if (vit != keyed_changes_.end()) - { - SequenceNumber_t seq = vit->second.cache_changes.back()->sequenceNumber; - return mp_writer->wait_for_acknowledgement(seq, max_blocking_time, lock); - } - } - return false; -} - -} // namespace fastrtps -} // namespace eprosima diff --git a/src/cpp/fastrtps_deprecated/publisher/PublisherImpl.cpp b/src/cpp/fastrtps_deprecated/publisher/PublisherImpl.cpp deleted file mode 100644 index f4b17fb41bb..00000000000 --- a/src/cpp/fastrtps_deprecated/publisher/PublisherImpl.cpp +++ /dev/null @@ -1,637 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* - * Publisher.cpp - * - */ -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include - -using namespace eprosima::fastrtps; -using namespace ::rtps; -using namespace std::chrono; - -using eprosima::fastdds::dds::TopicDataType; - -PublisherImpl::PublisherImpl( - ParticipantImpl* p, - TopicDataType* pdatatype, - const PublisherAttributes& att, - PublisherListener* listen ) - : mp_participant(p) - , mp_writer(nullptr) - , mp_type(pdatatype) - , m_att(att) -#pragma warning (disable : 4355 ) - , m_history(att.topic, - pdatatype->m_typeSize -#if HAVE_SECURITY - // In future v2 changepool is in writer, and writer set this value to cachechagepool. - + 20 /*SecureDataHeader*/ + 4 + ((2 * 16) /*EVP_MAX_IV_LENGTH max block size*/ - 1 ) /* SecureDataBodey*/ - + 16 + 4 /*SecureDataTag*/ -#endif // if HAVE_SECURITY - , att.historyMemoryPolicy) - , mp_listener(listen) -#pragma warning (disable : 4355 ) - , m_writerListener(this) - , mp_userPublisher(nullptr) - , mp_rtpsParticipant(nullptr) - , deadline_duration_us_(m_att.qos.m_deadline.period.to_ns() * 1e-3) - , timer_owner_() - , deadline_missed_status_() - , lifespan_duration_us_(m_att.qos.m_lifespan.duration.to_ns() * 1e-3) -{ - std::string topic_name = m_att.topic.getTopicName().to_string(); - PoolConfig pool_cfg = PoolConfig::from_history_attributes(m_history.m_att); - payload_pool_ = TopicPayloadPoolRegistry::get(topic_name, pool_cfg); - payload_pool_->reserve_history(pool_cfg, false); - - deadline_timer_ = new TimedEvent(mp_participant->get_resource_event(), - [&]() -> bool - { - return deadline_missed(); - }, - att.qos.m_deadline.period.to_ns() * 1e-6); - - lifespan_timer_ = new TimedEvent(mp_participant->get_resource_event(), - [&]() -> bool - { - return lifespan_expired(); - }, - m_att.qos.m_lifespan.duration.to_ns() * 1e-6); -} - -PublisherImpl::~PublisherImpl() -{ - delete(lifespan_timer_); - delete(deadline_timer_); - - if (mp_writer != nullptr) - { - EPROSIMA_LOG_INFO(PUBLISHER, this->getGuid().entityId << " in topic: " << this->m_att.topic.topicName); - } - - RTPSDomain::removeRTPSWriter(mp_writer); - delete(this->mp_userPublisher); - - std::string topic_name = m_att.topic.getTopicName().to_string(); - PoolConfig pool_cfg = PoolConfig::from_history_attributes(m_history.m_att); - payload_pool_->release_history(pool_cfg, false); -} - -bool PublisherImpl::create_new_change( - ChangeKind_t changeKind, - void* data) -{ - WriteParams wparams; - return create_new_change_with_params(changeKind, data, wparams); -} - -bool PublisherImpl::create_new_change_with_params( - ChangeKind_t changeKind, - void* data, - WriteParams& wparams) -{ - InstanceHandle_t handle; - if (m_att.topic.topicKind == WITH_KEY) - { - bool is_key_protected = false; -#if HAVE_SECURITY - is_key_protected = mp_writer->getAttributes().security_attributes().is_key_protected; -#endif // if HAVE_SECURITY - mp_type->getKey(data, &handle, is_key_protected); - } - - return create_new_change_with_params(changeKind, data, wparams, handle); -} - -bool PublisherImpl::create_new_change_with_params( - ChangeKind_t changeKind, - void* data, - WriteParams& wparams, - const InstanceHandle_t& handle) -{ - /// Preconditions - if (data == nullptr) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "Data pointer not valid"); - return false; - } - - if (changeKind == NOT_ALIVE_UNREGISTERED || changeKind == NOT_ALIVE_DISPOSED || - changeKind == NOT_ALIVE_DISPOSED_UNREGISTERED) - { - if (m_att.topic.topicKind == NO_KEY) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "Topic is NO_KEY, operation not permitted"); - return false; - } - } - - // Block lowlevel writer - auto max_blocking_time = steady_clock::now() + - microseconds(::TimeConv::Time_t2MicroSecondsInt64(m_att.qos.m_reliability.max_blocking_time)); - -#if HAVE_STRICT_REALTIME - std::unique_lock lock(mp_writer->getMutex(), std::defer_lock); - if (lock.try_lock_until(max_blocking_time)) -#else - std::unique_lock lock(mp_writer->getMutex()); -#endif // if HAVE_STRICT_REALTIME - { - CacheChange_t* ch = mp_writer->new_change(mp_type->getSerializedSizeProvider(data), changeKind, handle); - if (ch != nullptr) - { - if (changeKind == ALIVE) - { - //If these two checks are correct, we asume the cachechange is valid and thwn we can write to it. - if (!mp_type->serialize(data, &ch->serializedPayload)) - { - EPROSIMA_LOG_WARNING(RTPS_WRITER, "RTPSWriter:Serialization returns false"; ); - mp_writer->release_change(ch); - return false; - } - } - - InstanceHandle_t change_handle = ch->instanceHandle; - if (!this->m_history.add_pub_change(ch, wparams, lock, max_blocking_time)) - { - mp_writer->release_change(ch); - return false; - } - - if (m_att.qos.m_deadline.period != c_TimeInfinite) - { - if (!m_history.set_next_deadline( - change_handle, - steady_clock::now() + duration_cast(deadline_duration_us_))) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "Could not set the next deadline in the history"); - } - else - { - if (timer_owner_ == handle || timer_owner_ == InstanceHandle_t()) - { - if (deadline_timer_reschedule()) - { - deadline_timer_->cancel_timer(); - deadline_timer_->restart_timer(); - } - } - } - } - - if (m_att.qos.m_lifespan.duration != c_TimeInfinite) - { - lifespan_duration_us_ = duration>( - m_att.qos.m_lifespan.duration.to_ns() * 1e-3); - lifespan_timer_->update_interval_millisec(m_att.qos.m_lifespan.duration.to_ns() * 1e-6); - lifespan_timer_->restart_timer(); - } - - return true; - } - } - - return false; -} - -InstanceHandle_t PublisherImpl::register_instance( - void* instance) -{ - /// Preconditions - if (instance == nullptr) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "Data pointer not valid"); - return c_InstanceHandle_Unknown; - } - - if (m_att.topic.topicKind == NO_KEY) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "Topic is NO_KEY, operation not permitted"); - return c_InstanceHandle_Unknown; - } - - InstanceHandle_t instance_handle = c_InstanceHandle_Unknown; - bool is_key_protected = false; -#if HAVE_SECURITY - is_key_protected = mp_writer->getAttributes().security_attributes().is_key_protected; -#endif // if HAVE_SECURITY - mp_type->getKey(instance, &instance_handle, is_key_protected); - - // Block lowlevel writer - auto max_blocking_time = std::chrono::steady_clock::now() + - std::chrono::microseconds(::TimeConv::Time_t2MicroSecondsInt64(m_att.qos.m_reliability.max_blocking_time)); - -#if HAVE_STRICT_REALTIME - std::unique_lock lock(mp_writer->getMutex(), std::defer_lock); - if (lock.try_lock_until(max_blocking_time)) -#else - std::unique_lock lock(mp_writer->getMutex()); -#endif // if HAVE_STRICT_REALTIME - { - if (m_history.register_instance(instance_handle, lock, max_blocking_time)) - { - return instance_handle; - } - } - - return c_InstanceHandle_Unknown; -} - -bool PublisherImpl::unregister_instance( - void* instance, - const InstanceHandle_t& handle, - bool dispose) -{ - /// Preconditions - if (instance == nullptr) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "Data pointer not valid"); - return false; - } - - if (m_att.topic.topicKind == NO_KEY) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "Topic is NO_KEY, operation not permitted"); - return false; - } - - bool returned_value = false; - InstanceHandle_t ih = handle; - -#if !defined(NDEBUG) - if (c_InstanceHandle_Unknown == ih) -#endif // if !defined(NDEBUG) - { - bool is_key_protected = false; -#if HAVE_SECURITY - is_key_protected = mp_writer->getAttributes().security_attributes().is_key_protected; -#endif // if HAVE_SECURITY - mp_type->getKey(instance, &ih, is_key_protected); - } - -#if !defined(NDEBUG) - if (c_InstanceHandle_Unknown != handle && ih != handle) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "handle differs from data's key."); - return false; - } -#endif // if !defined(NDEBUG) - - if (m_history.is_key_registered(ih)) - { - WriteParams wparams; - ChangeKind_t change_kind = dispose ? NOT_ALIVE_DISPOSED : NOT_ALIVE_UNREGISTERED; - returned_value = create_new_change_with_params(change_kind, instance, wparams, ih); - } - - return returned_value; -} - -bool PublisherImpl::removeMinSeqChange() -{ - return m_history.removeMinChange(); -} - -bool PublisherImpl::removeAllChange( - size_t* removed) -{ - return m_history.removeAllChange(removed); -} - -const GUID_t& PublisherImpl::getGuid() -{ - return mp_writer->getGuid(); -} - -// -bool PublisherImpl::updateAttributes( - const PublisherAttributes& att) -{ - bool updated = true; - bool missing = false; - if (this->m_att.qos.m_reliability.kind == RELIABLE_RELIABILITY_QOS) - { - if (att.unicastLocatorList.size() != this->m_att.unicastLocatorList.size() || - att.multicastLocatorList.size() != this->m_att.multicastLocatorList.size()) - { - EPROSIMA_LOG_WARNING(PUBLISHER, "Locator Lists cannot be changed or updated in this version"); - updated &= false; - } - else - { - for (LocatorListConstIterator lit1 = this->m_att.unicastLocatorList.begin(); - lit1 != this->m_att.unicastLocatorList.end(); ++lit1) - { - missing = true; - for (LocatorListConstIterator lit2 = att.unicastLocatorList.begin(); - lit2 != att.unicastLocatorList.end(); ++lit2) - { - if (*lit1 == *lit2) - { - missing = false; - break; - } - } - if (missing) - { - EPROSIMA_LOG_WARNING(PUBLISHER, "Locator: " << *lit1 << " not present in new list"); - EPROSIMA_LOG_WARNING(PUBLISHER, "Locator Lists cannot be changed or updated in this version"); - } - } - for (LocatorListConstIterator lit1 = this->m_att.multicastLocatorList.begin(); - lit1 != this->m_att.multicastLocatorList.end(); ++lit1) - { - missing = true; - for (LocatorListConstIterator lit2 = att.multicastLocatorList.begin(); - lit2 != att.multicastLocatorList.end(); ++lit2) - { - if (*lit1 == *lit2) - { - missing = false; - break; - } - } - if (missing) - { - EPROSIMA_LOG_WARNING(PUBLISHER, "Locator: " << *lit1 << " not present in new list"); - EPROSIMA_LOG_WARNING(PUBLISHER, "Locator Lists cannot be changed or updated in this version"); - } - } - } - } - - //TOPIC ATTRIBUTES - if (this->m_att.topic != att.topic) - { - EPROSIMA_LOG_WARNING(PUBLISHER, "Topic Attributes cannot be updated"); - updated &= false; - } - //QOS: - //CHECK IF THE QOS CAN BE SET - if (!this->m_att.qos.canQosBeUpdated(att.qos)) - { - updated &= false; - } - if (updated) - { - if (this->m_att.qos.m_reliability.kind == RELIABLE_RELIABILITY_QOS) - { - //UPDATE TIMES: - StatefulWriter* sfw = (StatefulWriter*)mp_writer; - sfw->updateTimes(att.times); - } - - this->m_att.qos.setQos(att.qos, false); - this->m_att = att; - //Notify the participant that a Writer has changed its QOS - mp_rtpsParticipant->updateWriter(this->mp_writer, m_att.topic, m_att.qos); - - // Deadline - - if (m_att.qos.m_deadline.period != c_TimeInfinite) - { - deadline_duration_us_ = - duration>(m_att.qos.m_deadline.period.to_ns() * 1e-3); - deadline_timer_->update_interval_millisec(m_att.qos.m_deadline.period.to_ns() * 1e-6); - } - else - { - deadline_timer_->cancel_timer(); - } - - // Lifespan - - if (m_att.qos.m_lifespan.duration != c_TimeInfinite) - { - lifespan_duration_us_ = - duration>(m_att.qos.m_lifespan.duration.to_ns() * 1e-3); - lifespan_timer_->update_interval_millisec(m_att.qos.m_lifespan.duration.to_ns() * 1e-6); - } - else - { - lifespan_timer_->cancel_timer(); - } - } - - return updated; -} - -void PublisherImpl::PublisherWriterListener::onWriterMatched( - RTPSWriter* /*writer*/, - MatchingInfo& info) -{ - if ( mp_publisherImpl->mp_listener != nullptr ) - { - mp_publisherImpl->mp_listener->onPublicationMatched(mp_publisherImpl->mp_userPublisher, info); - } -} - -void PublisherImpl::PublisherWriterListener::onWriterChangeReceivedByAll( - RTPSWriter* /*writer*/, - CacheChange_t* ch) -{ - if (mp_publisherImpl->m_att.topic.topicKind == WITH_KEY && - (NOT_ALIVE_UNREGISTERED == ch->kind || - NOT_ALIVE_DISPOSED_UNREGISTERED == ch->kind)) - { - mp_publisherImpl->m_history.remove_instance_changes(ch->instanceHandle, ch->sequenceNumber); - } - else if (mp_publisherImpl->m_att.qos.m_durability.kind == VOLATILE_DURABILITY_QOS) - { - mp_publisherImpl->m_history.remove_change_g(ch); - } -} - -void PublisherImpl::PublisherWriterListener::on_liveliness_lost( - RTPSWriter* writer, - const LivelinessLostStatus& status) -{ - (void)writer; - - if (mp_publisherImpl->mp_listener != nullptr) - { - mp_publisherImpl->mp_listener->on_liveliness_lost( - mp_publisherImpl->mp_userPublisher, - status); - } -} - -bool PublisherImpl::wait_for_all_acked( - const eprosima::fastrtps::Duration_t& max_wait) -{ - return mp_writer->wait_for_all_acked(max_wait); -} - -bool PublisherImpl::deadline_timer_reschedule() -{ - assert(m_att.qos.m_deadline.period != c_TimeInfinite); - - std::unique_lock lock(mp_writer->getMutex()); - - steady_clock::time_point next_deadline_us; - if (!m_history.get_next_deadline(timer_owner_, next_deadline_us)) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "Could not get the next deadline from the history"); - return false; - } - - auto interval_ms = duration_cast(next_deadline_us - steady_clock::now()); - deadline_timer_->update_interval_millisec((double)interval_ms.count()); - return true; - -} - -bool PublisherImpl::deadline_missed() -{ - assert(m_att.qos.m_deadline.period != c_TimeInfinite); - - std::unique_lock lock(mp_writer->getMutex()); - - deadline_missed_status_.total_count++; - deadline_missed_status_.total_count_change++; - deadline_missed_status_.last_instance_handle = timer_owner_; - mp_listener->on_offered_deadline_missed(mp_userPublisher, deadline_missed_status_); - deadline_missed_status_.total_count_change = 0; - - if (!m_history.set_next_deadline( - timer_owner_, - steady_clock::now() + duration_cast(deadline_duration_us_))) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "Could not set the next deadline in the history"); - return false; - } - - return deadline_timer_reschedule(); -} - -void PublisherImpl::get_offered_deadline_missed_status( - OfferedDeadlineMissedStatus& status) -{ - std::unique_lock lock(mp_writer->getMutex()); - - status = deadline_missed_status_; - deadline_missed_status_.total_count_change = 0; -} - -bool PublisherImpl::lifespan_expired() -{ - std::unique_lock lock(mp_writer->getMutex()); - - CacheChange_t* earliest_change; - while (m_history.get_earliest_change(&earliest_change)) - { - auto source_timestamp = system_clock::time_point() + nanoseconds(earliest_change->sourceTimestamp.to_ns()); - auto now = system_clock::now(); - - // Check that the earliest change has expired (the change which started the timer could have been removed from the history) - if (now - source_timestamp < lifespan_duration_us_) - { - auto interval = source_timestamp - now + lifespan_duration_us_; - lifespan_timer_->update_interval_millisec((double)duration_cast(interval).count()); - return true; - } - - // The earliest change has expired - m_history.remove_change_pub(earliest_change); - - // Set the timer for the next change if there is one - if (!m_history.get_earliest_change(&earliest_change)) - { - return false; - } - - // Calculate when the next change is due to expire and restart - source_timestamp = system_clock::time_point() + nanoseconds(earliest_change->sourceTimestamp.to_ns()); - now = system_clock::now(); - auto interval = source_timestamp - now + lifespan_duration_us_; - - if (interval.count() > 0) - { - lifespan_timer_->update_interval_millisec((double)duration_cast(interval).count()); - return true; - } - } - - return false; -} - -void PublisherImpl::get_liveliness_lost_status( - LivelinessLostStatus& status) -{ - std::unique_lock lock(mp_writer->getMutex()); - - status = mp_writer->liveliness_lost_status_; - - mp_writer->liveliness_lost_status_.total_count_change = 0u; -} - -void PublisherImpl::assert_liveliness() -{ - if (!mp_rtpsParticipant->wlp()->assert_liveliness( - mp_writer->getGuid(), - mp_writer->get_liveliness_kind(), - mp_writer->get_liveliness_lease_duration())) - { - EPROSIMA_LOG_ERROR(PUBLISHER, "Could not assert liveliness of writer " << mp_writer->getGuid()); - } - - if (m_att.qos.m_liveliness.kind == MANUAL_BY_TOPIC_LIVELINESS_QOS) - { - // As described in the RTPS specification, if liveliness kind is manual a heartbeat must be sent - // This only applies to stateful writers, as stateless writers do not send heartbeats - - StatefulWriter* stateful_writer = dynamic_cast(mp_writer); - - if (stateful_writer != nullptr) - { - stateful_writer->send_periodic_heartbeat(true, true); - } - } -} - -void PublisherImpl::get_sending_locators( - rtps::LocatorList_t& locators) const -{ - mp_writer->getRTPSParticipant()->get_sending_locators(locators); -} - -std::shared_ptr PublisherImpl::payload_pool() -{ - return payload_pool_; -} diff --git a/src/cpp/fastrtps_deprecated/publisher/PublisherImpl.h b/src/cpp/fastrtps_deprecated/publisher/PublisherImpl.h deleted file mode 100644 index ca0db2822b0..00000000000 --- a/src/cpp/fastrtps_deprecated/publisher/PublisherImpl.h +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file Publisher.h - */ - - - -#ifndef PUBLISHERIMPL_H_ -#define PUBLISHERIMPL_H_ -#ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC - -#include -#include - -#include - -#include - -#include -#include - -#include - -#include - -namespace eprosima { -namespace fastrtps { -namespace rtps { -class RTPSWriter; -class RTPSParticipant; -class TimedEvent; -} // namespace rtps - -class PublisherListener; -class ParticipantImpl; -class Participant; -class Publisher; - - -/** - * Class PublisherImpl, contains the actual implementation of the behaviour of the Publisher. - * @ingroup FASTRTPS_MODULE - */ -class PublisherImpl -{ - friend class ParticipantImpl; - -public: - - /** - * Create a publisher, assigning its pointer to the associated writer. - * Don't use directly, create Publisher using DomainRTPSParticipant static function. - */ - PublisherImpl( - ParticipantImpl* p, - fastdds::dds::TopicDataType* ptype, - const PublisherAttributes& att, - PublisherListener* p_listen = nullptr); - - virtual ~PublisherImpl(); - - /** - * - * @param kind - * @param Data - * @return - */ - bool create_new_change( - rtps::ChangeKind_t kind, - void* Data); - - /** - * - * @param kind - * @param Data - * @param wparams - * @return - */ - bool create_new_change_with_params( - rtps::ChangeKind_t kind, - void* Data, - rtps::WriteParams& wparams); - - bool create_new_change_with_params( - rtps::ChangeKind_t kind, - void* Data, - rtps::WriteParams& wparams, - const rtps::InstanceHandle_t& handle); - - /*! - * @brief Implementation of the DDS `register_instance` operation. - * It deduces the instance's key and tries to get resources in the PublisherHistory. - * @param[in] instance Sample used to get the instance's key. - * @return Handle containing the instance's key. - * This handle could be used in successive `write` or `dispose` operations. - * In case of error, HANDLE_NIL will be returned. - */ - rtps::InstanceHandle_t register_instance( - void* instance); - - /*! - * @brief Implementation of the DDS `register_instance` and `dispose` operations. - * It sends a CacheChange_t with the king to NOT_ALIVE_UNREGISTERED or NOT_ALIVE_DISPOSED, - * depending on the `dispose` parameter. - * @param[in] instance Sample used to deduce instance's key in case of `handle` parameter is HANDLE_NIL. - * @param[in] handle Instance's key to be unregistered or disposed. - * @param[in] dispose If it is `false`, a CacheChange_t with kind to NOT_ALIVE_UNREGISTERED is sent. - * If it is `true`, a CacheChange_t with kind to NOT_ALIVE_DISPOSED is sent. - * @return Returns the operation's result. - * If the operation finishes successfully, `true` is returned. - */ - bool unregister_instance( - void* instance, - const rtps::InstanceHandle_t& handle, - bool dispose = false); - - /** - * Removes the cache change with the minimum sequence number - * @return True if correct. - */ - bool removeMinSeqChange(); - /** - * Removes all changes from the History. - * @param[out] removed Number of removed elements - * @return True if correct. - */ - bool removeAllChange( - size_t* removed); - - /** - * - * @return - */ - const rtps::GUID_t& getGuid(); - - /** - * Update the Attributes of the publisher; - * @param att Reference to a PublisherAttributes object to update the parameters; - * @return True if correctly updated, false if ANY of the updated parameters cannot be updated - */ - bool updateAttributes( - const PublisherAttributes& att); - - /** - * Get the Attributes of the Subscriber. - * @return Attributes of the Subscriber. - */ - inline const PublisherAttributes& getAttributes() - { - return m_att; - } - - /** - * Get topic data type - * @return Topic data type - */ - fastdds::dds::TopicDataType* getType() - { - return mp_type; - } - - bool wait_for_all_acked( - const Duration_t& max_wait); - - /** - * @brief Returns the offered deadline missed status - * @param Deadline missed status struct - */ - void get_offered_deadline_missed_status( - OfferedDeadlineMissedStatus& status); - - /** - * @brief Returns the liveliness lost status - * @param status Liveliness lost status - */ - void get_liveliness_lost_status( - LivelinessLostStatus& status); - - /** - * @brief Asserts liveliness - */ - void assert_liveliness(); - - /** - * Get the list of locators from which this publisher may send data. - * - * @param [out] locators LocatorList_t where the list of locators will be stored. - */ - void get_sending_locators( - rtps::LocatorList_t& locators) const; - - std::shared_ptr payload_pool(); - -private: - - ParticipantImpl* mp_participant; - //! Pointer to the associated Data Writer. - rtps::RTPSWriter* mp_writer; - //! Pointer to the TopicDataType object. - fastdds::dds::TopicDataType* mp_type; - //!Attributes of the Publisher - PublisherAttributes m_att; - //!Publisher History - PublisherHistory m_history; - //!PublisherListener - PublisherListener* mp_listener; - //!Listener to capture the events of the Writer - class PublisherWriterListener : public rtps::WriterListener - { - public: - - PublisherWriterListener( - PublisherImpl* p) - : mp_publisherImpl(p) - { - } - - virtual ~PublisherWriterListener() - { - } - - void onWriterMatched( - rtps::RTPSWriter* writer, - rtps::MatchingInfo& info) override; - void onWriterChangeReceivedByAll( - rtps::RTPSWriter* writer, - rtps::CacheChange_t* change) override; - void on_liveliness_lost( - rtps::RTPSWriter* writer, - const LivelinessLostStatus& status) override; - - PublisherImpl* mp_publisherImpl; - - private: - - using rtps::WriterListener::onWriterMatched; - } - m_writerListener; - - Publisher* mp_userPublisher; - - rtps::RTPSParticipant* mp_rtpsParticipant; - - //! A timer used to check for deadlines - rtps::TimedEvent* deadline_timer_; - //! Deadline duration in microseconds - std::chrono::duration> deadline_duration_us_; - //! The current timer owner, i.e. the instance which started the deadline timer - rtps::InstanceHandle_t timer_owner_; - //! The offered deadline missed status - OfferedDeadlineMissedStatus deadline_missed_status_; - - //! A timed callback to remove expired samples for lifespan QoS - rtps::TimedEvent* lifespan_timer_; - //! The lifespan duration, in microseconds - std::chrono::duration> lifespan_duration_us_; - - std::shared_ptr payload_pool_; - - /** - * @brief A method called when an instance misses the deadline - */ - bool deadline_missed(); - - /** - * @brief A method to reschedule the deadline timer - * @return true value when the event has to be rescheduled. false value if not. - */ - bool deadline_timer_reschedule(); - - /** - * @brief A method to remove expired samples, invoked when the lifespan timer expires - * @return true value when the event has to be rescheduled. false value if not. - */ - bool lifespan_expired(); -}; - - -} // namespace fastrtps -} // namespace eprosima - -#endif // ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#endif /* PUBLISHERIMPL_H_ */ diff --git a/src/cpp/fastrtps_deprecated/subscriber/Subscriber.cpp b/src/cpp/fastrtps_deprecated/subscriber/Subscriber.cpp deleted file mode 100644 index d4d738d2991..00000000000 --- a/src/cpp/fastrtps_deprecated/subscriber/Subscriber.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* - * Subscriber.cpp - * - */ - -#include -#include - -#include - -using namespace eprosima::fastrtps; -using namespace eprosima::fastrtps::rtps; - -const GUID_t& Subscriber::getGuid() -{ - return mp_impl->getGuid(); -} - -bool Subscriber::wait_for_unread_samples( - const Duration_t& timeout) -{ - return mp_impl->wait_for_unread_samples(timeout); -} - -bool Subscriber::readNextData( - void* data, - SampleInfo_t* info) -{ - return mp_impl->readNextData(data, info); -} - -bool Subscriber::takeNextData( - void* data, - SampleInfo_t* info) -{ - return mp_impl->takeNextData(data, info); -} - -bool Subscriber::get_first_untaken_info( - SampleInfo_t* info) -{ - return mp_impl->get_first_untaken_info(info); -} - -bool Subscriber::updateAttributes( - const SubscriberAttributes& att) -{ - return mp_impl->updateAttributes(att); -} - -const SubscriberAttributes& Subscriber::getAttributes() const -{ - return mp_impl->getAttributes(); -} - -bool Subscriber::isInCleanState() const -{ - return mp_impl->isInCleanState(); -} - -uint64_t Subscriber::get_unread_count() const -{ - return mp_impl->get_unread_count(); -} - -void Subscriber::get_requested_deadline_missed_status( - RequestedDeadlineMissedStatus& status) -{ - mp_impl->get_requested_deadline_missed_status(status); -} - -void Subscriber::get_liveliness_changed_status( - LivelinessChangedStatus& status) -{ - mp_impl->get_liveliness_changed_status(status); -} - -void Subscriber::get_listening_locators( - rtps::LocatorList_t& locators) const -{ - assert(mp_impl != nullptr); - mp_impl->get_listening_locators(locators); -} diff --git a/src/cpp/fastrtps_deprecated/subscriber/SubscriberHistory.cpp b/src/cpp/fastrtps_deprecated/subscriber/SubscriberHistory.cpp deleted file mode 100644 index 6cc37ed0269..00000000000 --- a/src/cpp/fastrtps_deprecated/subscriber/SubscriberHistory.cpp +++ /dev/null @@ -1,835 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file SubscriberHistory.cpp - * - */ - -#include - -#include -#include - -#include -#include - -#include - -#include - -#include -#include -#include - -namespace eprosima { -namespace fastrtps { - -using namespace rtps; - -using eprosima::fastdds::dds::TopicDataType; - -static void get_sample_info( - SampleInfo_t* info, - CacheChange_t* change, - uint32_t ownership_strength) -{ - info->sampleKind = change->kind; - info->sample_identity.writer_guid(change->writerGUID); - info->sample_identity.sequence_number(change->sequenceNumber); - info->sourceTimestamp = change->sourceTimestamp; - info->receptionTimestamp = change->reader_info.receptionTimestamp; - info->ownershipStrength = ownership_strength; - info->iHandle = change->instanceHandle; - info->related_sample_identity = change->write_params.sample_identity(); -} - -static HistoryAttributes to_history_attributes( - const TopicAttributes& topic_att, - uint32_t payloadMaxSize, - MemoryManagementPolicy_t mempolicy) -{ - auto initial_samples = topic_att.resourceLimitsQos.allocated_samples; - auto max_samples = topic_att.resourceLimitsQos.max_samples; - - if (topic_att.historyQos.kind != KEEP_ALL_HISTORY_QOS) - { - max_samples = topic_att.historyQos.depth; - if (topic_att.getTopicKind() != NO_KEY) - { - max_samples *= topic_att.resourceLimitsQos.max_instances; - } - - initial_samples = std::min(initial_samples, max_samples); - } - - return HistoryAttributes(mempolicy, payloadMaxSize, initial_samples, max_samples); -} - -SubscriberHistory::SubscriberHistory( - const TopicAttributes& topic_att, - TopicDataType* type, - const ReaderQos& qos, - uint32_t payloadMaxSize, - MemoryManagementPolicy_t mempolicy) - : ReaderHistory(to_history_attributes(topic_att, payloadMaxSize, mempolicy)) - , history_qos_(topic_att.historyQos) - , resource_limited_qos_(topic_att.resourceLimitsQos) - , topic_att_(topic_att) - , type_(type) - , qos_(qos) - , get_key_object_(nullptr) -{ - if (type_->m_isGetKeyDefined) - { - get_key_object_ = type_->createData(); - } - - if (resource_limited_qos_.max_samples <= 0) - { - resource_limited_qos_.max_samples = std::numeric_limits::max(); - } - - if (resource_limited_qos_.max_instances <= 0) - { - resource_limited_qos_.max_instances = std::numeric_limits::max(); - } - - if (resource_limited_qos_.max_samples_per_instance <= 0) - { - resource_limited_qos_.max_samples_per_instance = std::numeric_limits::max(); - } - - using std::placeholders::_1; - using std::placeholders::_2; - - if (topic_att.getTopicKind() == NO_KEY) - { - receive_fn_ = topic_att.historyQos.kind == KEEP_ALL_HISTORY_QOS ? - std::bind(&SubscriberHistory::received_change_keep_all_no_key, this, _1, _2) : - std::bind(&SubscriberHistory::received_change_keep_last_no_key, this, _1, _2); - } - else - { - receive_fn_ = topic_att.historyQos.kind == KEEP_ALL_HISTORY_QOS ? - std::bind(&SubscriberHistory::received_change_keep_all_with_key, this, _1, _2) : - std::bind(&SubscriberHistory::received_change_keep_last_with_key, this, _1, _2); - complete_fn_ = topic_att.historyQos.kind == KEEP_ALL_HISTORY_QOS ? - std::bind(&SubscriberHistory::completed_change_keep_all_with_key, this, _1) : - std::bind(&SubscriberHistory::completed_change_keep_last_with_key, this, _1); - } -} - -SubscriberHistory::~SubscriberHistory() -{ - if (type_->m_isGetKeyDefined) - { - type_->deleteData(get_key_object_); - } -} - -bool SubscriberHistory::can_change_be_added_nts( - const rtps::GUID_t& writer_guid, - uint32_t total_payload_size, - size_t unknown_missing_changes_up_to, - bool& will_never_be_accepted) const -{ - if (!ReaderHistory::can_change_be_added_nts(writer_guid, total_payload_size, unknown_missing_changes_up_to, - will_never_be_accepted)) - { - return false; - } - - will_never_be_accepted = false; - return (KEEP_ALL_HISTORY_QOS != history_qos_.kind) || - (m_changes.size() + unknown_missing_changes_up_to < static_cast(resource_limited_qos_.max_samples)); -} - -bool SubscriberHistory::received_change( - CacheChange_t* a_change, - size_t unknown_missing_changes_up_to) -{ - if (mp_reader == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "You need to create a Reader with this History before using it"); - return false; - } - - std::lock_guard guard(*mp_mutex); - return receive_fn_(a_change, unknown_missing_changes_up_to); -} - -bool SubscriberHistory::received_change_keep_all_no_key( - CacheChange_t* a_change, - size_t unknown_missing_changes_up_to) -{ - // TODO(Ricardo) Check - if (m_changes.size() + unknown_missing_changes_up_to < static_cast(resource_limited_qos_.max_samples)) - { - return add_received_change(a_change); - } - - return false; -} - -bool SubscriberHistory::received_change_keep_last_no_key( - CacheChange_t* a_change, - size_t /* unknown_missing_changes_up_to */ ) -{ - bool add = false; - if (m_changes.size() < static_cast(history_qos_.depth)) - { - add = true; - } - else - { - // Try to substitute the oldest sample. - - // As the history should be ordered following the presentation QoS, we can always remove the first one. - add = remove_change_sub(m_changes.at(0)); - } - - if (add) - { - return add_received_change(a_change); - } - - return false; -} - -bool SubscriberHistory::received_change_keep_all_with_key( - CacheChange_t* a_change, - size_t /* unknown_missing_changes_up_to */ ) -{ - // TODO(Miguel C): Should we check unknown_missing_changes_up_to as it is done in received_change_keep_all_no_key? - - bool ret_value = false; - t_m_Inst_Caches::iterator vit; - if (a_change->instanceHandle.isDefined() || a_change->is_fully_assembled()) // In this case we can obtain the the key. - { - if (find_key_for_change(a_change, vit)) - { - std::vector& instance_changes = vit->second.cache_changes; - if (instance_changes.size() < static_cast(resource_limited_qos_.max_samples_per_instance)) - { - ret_value = add_received_change_with_key(a_change, vit->second.cache_changes); - } - else - { - EPROSIMA_LOG_WARNING(SUBSCRIBER, "Change not added due to maximum number of samples per instance"); - } - } - } - else // Store the sample temporally only in ReaderHistory. When completed it will be stored in SubscriberHistory too. - { - if (!m_isHistoryFull) - { - ret_value = add_change(a_change); - - if (m_changes.size() == static_cast(m_att.maximumReservedCaches)) - { - m_isHistoryFull = true; - } - } - else - { - // Discarting the sample. - EPROSIMA_LOG_WARNING(SUBSCRIBER, - "Attempting to add Data to Full ReaderHistory: " << topic_att_.getTopicDataType()); - } - } - - return ret_value; -} - -bool SubscriberHistory::received_change_keep_last_with_key( - CacheChange_t* a_change, - size_t /* unknown_missing_changes_up_to */) -{ - bool ret_value = false; - t_m_Inst_Caches::iterator vit; - if (a_change->instanceHandle.isDefined() || a_change->is_fully_assembled()) // In this case we can obtain the the key. - { - if (find_key_for_change(a_change, vit)) - { - bool add = false; - std::vector& instance_changes = vit->second.cache_changes; - if (instance_changes.size() < static_cast(history_qos_.depth)) - { - add = true; - } - else - { - // Try to substitute the oldest sample. - - // As the instance should be ordered following the presentation QoS, we can always remove the first one. - add = remove_change_sub(instance_changes.at(0)); - } - - if (add) - { - ret_value = add_received_change_with_key(a_change, instance_changes); - } - } - } - else // Store the sample temporally only in ReaderHistory. When completed it will be stored in SubscriberHistory too. - { - if (!m_isHistoryFull) - { - ret_value = add_change(a_change); - - if (m_changes.size() == static_cast(m_att.maximumReservedCaches)) - { - m_isHistoryFull = true; - } - } - else - { - // Discarting the sample. - EPROSIMA_LOG_WARNING(SUBSCRIBER, - "Attempting to add Data to Full ReaderHistory: " << topic_att_.getTopicDataType()); - } - } - - return ret_value; -} - -bool SubscriberHistory::add_received_change( - CacheChange_t* a_change) -{ - if (m_isHistoryFull) - { - // Discarding the sample. - EPROSIMA_LOG_WARNING(SUBSCRIBER, - "Attempting to add Data to Full ReaderHistory: " << topic_att_.getTopicDataType()); - return false; - } - - if (add_change(a_change)) - { - if (m_changes.size() == static_cast(m_att.maximumReservedCaches)) - { - m_isHistoryFull = true; - } - - EPROSIMA_LOG_INFO(SUBSCRIBER, topic_att_.getTopicDataType() - << ": Change " << a_change->sequenceNumber << " added from: " - << a_change->writerGUID; ); - - return true; - } - - return false; -} - -bool SubscriberHistory::add_received_change_with_key( - CacheChange_t* a_change, - std::vector& instance_changes) -{ - if (m_isHistoryFull) - { - // Discarting the sample. - EPROSIMA_LOG_WARNING(SUBSCRIBER, - "Attempting to add Data to Full ReaderHistory: " << topic_att_.getTopicDataType()); - return false; - } - - if (add_change(a_change)) - { - if (m_changes.size() == static_cast(m_att.maximumReservedCaches)) - { - m_isHistoryFull = true; - } - - //ADD TO KEY VECTOR - eprosima::utilities::collections::sorted_vector_insert(instance_changes, a_change, - fastdds::rtps::history_order_cmp); - - EPROSIMA_LOG_INFO(SUBSCRIBER, mp_reader->getGuid().entityId - << ": Change " << a_change->sequenceNumber << " added from: " - << a_change->writerGUID << " with KEY: " << a_change->instanceHandle; ); - - return true; - } - - return false; -} - -bool SubscriberHistory::find_key_for_change( - rtps::CacheChange_t* a_change, - t_m_Inst_Caches::iterator& map_it) -{ - if (!a_change->instanceHandle.isDefined() && type_ != nullptr) - { - EPROSIMA_LOG_INFO(SUBSCRIBER, "Getting Key of change with no Key transmitted"); - type_->deserialize(&a_change->serializedPayload, get_key_object_); - bool is_key_protected = false; -#if HAVE_SECURITY - is_key_protected = mp_reader->getAttributes().security_attributes().is_key_protected; -#endif // if HAVE_SECURITY - if (!type_->getKey(get_key_object_, &a_change->instanceHandle, is_key_protected)) - { - return false; - } - } - else if (!a_change->instanceHandle.isDefined()) - { - EPROSIMA_LOG_WARNING(SUBSCRIBER, "NO KEY in topic: " << topic_att_.topicName - << " and no method to obtain it"; ); - return false; - } - - return find_key(a_change, map_it); -} - -bool SubscriberHistory::deserialize_change( - CacheChange_t* change, - uint32_t ownership_strength, - void* data, - SampleInfo_t* info) -{ - if (change->kind == ALIVE) - { - if (!type_->deserialize(&change->serializedPayload, data)) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "Deserialization of data failed"); - return false; - } - } - - if (info != nullptr) - { - if (topic_att_.topicKind == WITH_KEY && - change->instanceHandle == c_InstanceHandle_Unknown && - change->kind == ALIVE) - { - bool is_key_protected = false; -#if HAVE_SECURITY - is_key_protected = mp_reader->getAttributes().security_attributes().is_key_protected; -#endif // if HAVE_SECURITY - type_->getKey(data, &change->instanceHandle, is_key_protected); - } - - get_sample_info(info, change, ownership_strength); - } - - return true; -} - -bool SubscriberHistory::readNextData( - void* data, - SampleInfo_t* info, - std::chrono::steady_clock::time_point& max_blocking_time) -{ - if (mp_reader == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "You need to create a Reader with this History before using it"); - return false; - } - - std::unique_lock lock(*mp_mutex, std::defer_lock); - - if (lock.try_lock_until(max_blocking_time)) - { - CacheChange_t* change; - WriterProxy* wp = nullptr; - if (mp_reader->nextUnreadCache(&change, &wp)) - { - EPROSIMA_LOG_INFO(SUBSCRIBER, mp_reader->getGuid().entityId << ": reading " << change->sequenceNumber); - uint32_t ownership = wp && qos_.m_ownership.kind == EXCLUSIVE_OWNERSHIP_QOS ? - wp->ownership_strength() : 0; - bool deserialized = deserialize_change(change, ownership, data, info); - mp_reader->change_read_by_user(change, wp); - return deserialized; - } - } - return false; -} - -bool SubscriberHistory::takeNextData( - void* data, - SampleInfo_t* info, - std::chrono::steady_clock::time_point& max_blocking_time) -{ - if (mp_reader == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "You need to create a Reader with this History before using it"); - return false; - } - - std::unique_lock lock(*mp_mutex, std::defer_lock); - - if (lock.try_lock_until(max_blocking_time)) - { - CacheChange_t* change = nullptr; - WriterProxy* wp = nullptr; - if (mp_reader->nextUntakenCache(&change, &wp)) - { - EPROSIMA_LOG_INFO(SUBSCRIBER, - mp_reader->getGuid().entityId << ": taking seqNum" << change->sequenceNumber << - " from writer: " << change->writerGUID); - uint32_t ownership = wp && qos_.m_ownership.kind == EXCLUSIVE_OWNERSHIP_QOS ? - wp->ownership_strength() : 0; - bool deserialized = deserialize_change(change, ownership, data, info); - mp_reader->change_read_by_user(change, wp); - bool removed = remove_change_sub(change); - return (deserialized && removed); - } - } - - return false; -} - -bool SubscriberHistory::get_first_untaken_info( - SampleInfo_t* info) -{ - std::lock_guard lock(*mp_mutex); - - CacheChange_t* change = nullptr; - WriterProxy* wp = nullptr; - if (mp_reader->nextUntakenCache(&change, &wp)) - { - uint32_t ownership = wp && qos_.m_ownership.kind == EXCLUSIVE_OWNERSHIP_QOS ? wp->ownership_strength() : 0; - get_sample_info(info, change, ownership); - mp_reader->change_read_by_user(change, wp, false); - return true; - } - - return false; -} - -bool SubscriberHistory::find_key( - CacheChange_t* a_change, - t_m_Inst_Caches::iterator& vit_out) -{ - vit_out = keyed_changes_.find(a_change->instanceHandle); - if (vit_out != keyed_changes_.end()) - { - return true; - } - - if (keyed_changes_.size() < static_cast(resource_limited_qos_.max_instances)) - { - vit_out = keyed_changes_.insert(std::make_pair(a_change->instanceHandle, KeyedChanges())).first; - return true; - } - else - { - for (t_m_Inst_Caches::iterator vit = keyed_changes_.begin(); vit != keyed_changes_.end(); ++vit) - { - if (vit->second.cache_changes.size() == 0) - { - keyed_changes_.erase(vit); - vit_out = keyed_changes_.insert(std::make_pair(a_change->instanceHandle, KeyedChanges())).first; - return true; - } - } - EPROSIMA_LOG_WARNING(SUBSCRIBER, "History has reached the maximum number of instances"); - } - return false; -} - -bool SubscriberHistory::remove_change_sub( - CacheChange_t* change) -{ - if (mp_reader == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "You need to create a Reader with this History before using it"); - return false; - } - - std::lock_guard guard(*mp_mutex); - if (topic_att_.getTopicKind() == WITH_KEY) - { - bool found = false; - t_m_Inst_Caches::iterator vit; - if (find_key(change, vit)) - { - for (auto chit = vit->second.cache_changes.begin(); chit != vit->second.cache_changes.end(); ++chit) - { - if ((*chit)->sequenceNumber == change->sequenceNumber && (*chit)->writerGUID == change->writerGUID) - { - vit->second.cache_changes.erase(chit); - found = true; - break; - } - } - } - if (!found) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "Change not found on this key, something is wrong"); - } - } - - if (remove_change(change)) - { - m_isHistoryFull = false; - return true; - } - - return false; -} - -bool SubscriberHistory::remove_change_sub( - CacheChange_t* change, - iterator& it) -{ - if (mp_reader == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "You need to create a Reader with this History before using it"); - return false; - } - - std::lock_guard guard(*mp_mutex); - if (topic_att_.getTopicKind() == WITH_KEY) - { - bool found = false; - t_m_Inst_Caches::iterator vit; - if (find_key(change, vit)) - { - for (auto chit = vit->second.cache_changes.begin(); chit != vit->second.cache_changes.end(); ++chit) - { - if ((*chit)->sequenceNumber == change->sequenceNumber && (*chit)->writerGUID == change->writerGUID) - { - assert(it == chit); - it = vit->second.cache_changes.erase(chit); - found = true; - break; - } - } - } - if (!found) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "Change not found on this key, something is wrong"); - } - } - - const_iterator chit = find_change_nts(change); - if (chit == changesEnd()) - { - EPROSIMA_LOG_INFO(RTPS_WRITER_HISTORY, "Trying to remove a change not in history"); - return false; - } - - m_isHistoryFull = false; - iterator ret_it = remove_change_nts(chit); - - if (topic_att_.getTopicKind() != WITH_KEY) - { - it = ret_it; - } - - return true; -} - -bool SubscriberHistory::set_next_deadline( - const InstanceHandle_t& handle, - const std::chrono::steady_clock::time_point& next_deadline_us) -{ - if (mp_reader == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "You need to create a Reader with this History before using it"); - return false; - } - std::lock_guard guard(*mp_mutex); - - if (topic_att_.getTopicKind() == NO_KEY) - { - next_deadline_us_ = next_deadline_us; - return true; - } - else if (topic_att_.getTopicKind() == WITH_KEY) - { - if (keyed_changes_.find(handle) == keyed_changes_.end()) - { - return false; - } - - keyed_changes_[handle].next_deadline_us = next_deadline_us; - return true; - } - - return false; -} - -bool SubscriberHistory::get_next_deadline( - InstanceHandle_t& handle, - std::chrono::steady_clock::time_point& next_deadline_us) -{ - if (mp_reader == nullptr || mp_mutex == nullptr) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "You need to create a Reader with this History before using it"); - return false; - } - std::lock_guard guard(*mp_mutex); - - if (topic_att_.getTopicKind() == NO_KEY) - { - next_deadline_us = next_deadline_us_; - return true; - } - else if (topic_att_.getTopicKind() == WITH_KEY) - { - auto min = std::min_element(keyed_changes_.begin(), - keyed_changes_.end(), - []( - const std::pair& lhs, - const std::pair& rhs) - { - return lhs.second.next_deadline_us < rhs.second.next_deadline_us; - }); - handle = min->first; - next_deadline_us = min->second.next_deadline_us; - return true; - } - - return false; -} - -ReaderHistory::iterator SubscriberHistory::remove_change_nts( - ReaderHistory::const_iterator removal, - bool release) -{ - CacheChange_t* p_sample = nullptr; - - if ( removal != changesEnd() - && (p_sample = *removal)->instanceHandle.isDefined() - && topic_att_.getTopicKind() == WITH_KEY) - { - // clean any references to this CacheChange in the key state collection - auto it = keyed_changes_.find(p_sample->instanceHandle); - - // if keyed and in history must be in the map - assert(it != keyed_changes_.end()); - - auto& c = it->second.cache_changes; - c.erase(std::remove(c.begin(), c.end(), p_sample), c.end()); - } - - // call the base class - return ReaderHistory::remove_change_nts(removal, release); -} - -bool SubscriberHistory::completed_change( - rtps::CacheChange_t* change) -{ - bool ret_value = true; - - if (complete_fn_) - { - ret_value = complete_fn_(change); - } - - return ret_value; -} - -bool SubscriberHistory::completed_change_keep_all_with_key( - CacheChange_t* a_change) -{ - bool ret_value = false; - - if (!a_change->instanceHandle.isDefined()) - { - t_m_Inst_Caches::iterator vit; - if (find_key_for_change(a_change, vit)) - { - std::vector& instance_changes = vit->second.cache_changes; - if (instance_changes.size() < static_cast(resource_limited_qos_.max_samples_per_instance)) - { - //ADD TO KEY VECTOR - eprosima::utilities::collections::sorted_vector_insert(instance_changes, a_change, - fastdds::rtps::history_order_cmp); - ret_value = true; - - EPROSIMA_LOG_INFO(SUBSCRIBER, mp_reader->getGuid().entityId - << ": Change " << a_change->sequenceNumber << " added from: " - << a_change->writerGUID << " with KEY: " << a_change->instanceHandle; ); - } - else - { - EPROSIMA_LOG_WARNING(SUBSCRIBER, "Change not added due to maximum number of samples per instance"); - - const_iterator chit = find_change_nts(a_change); - if (chit != changesEnd()) - { - m_isHistoryFull = false; - remove_change_nts(chit); - } - else - { - EPROSIMA_LOG_ERROR(RTPS_WRITER_HISTORY, "Change should exists but didn't find it"); - } - } - } - } - - return ret_value; -} - -bool SubscriberHistory::completed_change_keep_last_with_key( - CacheChange_t* a_change) -{ - bool ret_value = false; - - if (!a_change->instanceHandle.isDefined()) - { - t_m_Inst_Caches::iterator vit; - if (find_key_for_change(a_change, vit)) - { - bool add = false; - std::vector& instance_changes = vit->second.cache_changes; - if (instance_changes.size() < static_cast(history_qos_.depth)) - { - add = true; - } - else - { - // Try to substitute the oldest sample. - - // As the instance should be ordered following the presentation QoS, we can always remove the first one. - add = remove_change_sub(instance_changes.at(0)); - } - - if (add) - { - //ADD TO KEY VECTOR - eprosima::utilities::collections::sorted_vector_insert(instance_changes, a_change, - fastdds::rtps::history_order_cmp); - ret_value = true; - - EPROSIMA_LOG_INFO(SUBSCRIBER, mp_reader->getGuid().entityId - << ": Change " << a_change->sequenceNumber << " added from: " - << a_change->writerGUID << " with KEY: " << a_change->instanceHandle; ); - } - else - { - const_iterator chit = find_change_nts(a_change); - if (chit != changesEnd()) - { - m_isHistoryFull = false; - remove_change_nts(chit); - } - else - { - EPROSIMA_LOG_ERROR(RTPS_WRITER_HISTORY, "Change should exists but didn't find it"); - } - } - } - } - - return ret_value; -} - -} // namespace fastrtps -} // namsepace eprosima diff --git a/src/cpp/fastrtps_deprecated/subscriber/SubscriberImpl.cpp b/src/cpp/fastrtps_deprecated/subscriber/SubscriberImpl.cpp deleted file mode 100644 index 487a3a8662e..00000000000 --- a/src/cpp/fastrtps_deprecated/subscriber/SubscriberImpl.cpp +++ /dev/null @@ -1,494 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file SubscriberImpl.cpp - * - */ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -using namespace eprosima::fastrtps::rtps; -using namespace std::chrono; - -using eprosima::fastdds::dds::TopicDataType; - -namespace eprosima { -namespace fastrtps { - - -SubscriberImpl::SubscriberImpl( - ParticipantImpl* p, - TopicDataType* ptype, - const SubscriberAttributes& att, - SubscriberListener* listen) - : mp_participant(p) - , mp_reader(nullptr) - , mp_type(ptype) - , m_att(att) -#pragma warning (disable : 4355 ) - , m_history(att.topic, - ptype, - att.qos, - ptype->m_typeSize + 3 /*Possible alignment*/, - att.historyMemoryPolicy) - , mp_listener(listen) - , m_readerListener(this) - , mp_userSubscriber(nullptr) - , mp_rtpsParticipant(nullptr) - , deadline_duration_us_(m_att.qos.m_deadline.period.to_ns() * 1e-3) - , deadline_missed_status_() - , lifespan_duration_us_(m_att.qos.m_lifespan.duration.to_ns() * 1e-3) -{ - std::string topic_name = m_att.topic.getTopicName().to_string(); - PoolConfig pool_cfg = PoolConfig::from_history_attributes(m_history.m_att); - payload_pool_ = TopicPayloadPoolRegistry::get(topic_name, pool_cfg); - payload_pool_->reserve_history(pool_cfg, true); - - deadline_timer_ = new TimedEvent(mp_participant->get_resource_event(), - [&]() -> bool - { - return deadline_missed(); - }, - att.qos.m_deadline.period.to_ns() * 1e-6); - - lifespan_timer_ = new TimedEvent(mp_participant->get_resource_event(), - [&]() -> bool - { - return lifespan_expired(); - }, - att.qos.m_lifespan.duration.to_ns() * 1e-6); -} - -SubscriberImpl::~SubscriberImpl() -{ - delete(lifespan_timer_); - delete(deadline_timer_); - - if (mp_reader != nullptr) - { - EPROSIMA_LOG_INFO(SUBSCRIBER, this->getGuid().entityId << " in topic: " << this->m_att.topic.topicName); - } - - RTPSDomain::removeRTPSReader(mp_reader); - delete(this->mp_userSubscriber); - - std::string topic_name = m_att.topic.getTopicName().to_string(); - PoolConfig pool_cfg = PoolConfig::from_history_attributes(m_history.m_att); - payload_pool_->release_history(pool_cfg, true); -} - -bool SubscriberImpl::wait_for_unread_samples( - const Duration_t& timeout) -{ - return mp_reader->wait_for_unread_cache(timeout); -} - -bool SubscriberImpl::readNextData( - void* data, - SampleInfo_t* info) -{ - auto max_blocking_time = std::chrono::steady_clock::now() + -#if HAVE_STRICT_REALTIME - std::chrono::microseconds(::TimeConv::Time_t2MicroSecondsInt64(m_att.qos.m_reliability.max_blocking_time)); -#else - std::chrono::hours(24); -#endif // if HAVE_STRICT_REALTIME - return this->m_history.readNextData(data, info, max_blocking_time); -} - -bool SubscriberImpl::takeNextData( - void* data, - SampleInfo_t* info) -{ - auto max_blocking_time = std::chrono::steady_clock::now() + -#if HAVE_STRICT_REALTIME - std::chrono::microseconds(::TimeConv::Time_t2MicroSecondsInt64(m_att.qos.m_reliability.max_blocking_time)); -#else - std::chrono::hours(24); -#endif // if HAVE_STRICT_REALTIME - return this->m_history.takeNextData(data, info, max_blocking_time); -} - -bool SubscriberImpl::get_first_untaken_info( - SampleInfo_t* info) -{ - return m_history.get_first_untaken_info(info); -} - -const GUID_t& SubscriberImpl::getGuid() -{ - return mp_reader->getGuid(); -} - -bool SubscriberImpl::updateAttributes( - const SubscriberAttributes& att) -{ - bool updated = true; - bool missing = false; - if (att.unicastLocatorList.size() != this->m_att.unicastLocatorList.size() || - att.multicastLocatorList.size() != this->m_att.multicastLocatorList.size()) - { - EPROSIMA_LOG_WARNING(RTPS_READER, "Locator Lists cannot be changed or updated in this version"); - updated &= false; - } - else - { - for (LocatorListConstIterator lit1 = this->m_att.unicastLocatorList.begin(); - lit1 != this->m_att.unicastLocatorList.end(); ++lit1) - { - missing = true; - for (LocatorListConstIterator lit2 = att.unicastLocatorList.begin(); - lit2 != att.unicastLocatorList.end(); ++lit2) - { - if (*lit1 == *lit2) - { - missing = false; - break; - } - } - if (missing) - { - EPROSIMA_LOG_WARNING(RTPS_READER, "Locator: " << *lit1 << " not present in new list"); - EPROSIMA_LOG_WARNING(RTPS_READER, "Locator Lists cannot be changed or updated in this version"); - } - } - for (LocatorListConstIterator lit1 = this->m_att.multicastLocatorList.begin(); - lit1 != this->m_att.multicastLocatorList.end(); ++lit1) - { - missing = true; - for (LocatorListConstIterator lit2 = att.multicastLocatorList.begin(); - lit2 != att.multicastLocatorList.end(); ++lit2) - { - if (*lit1 == *lit2) - { - missing = false; - break; - } - } - if (missing) - { - EPROSIMA_LOG_WARNING(RTPS_READER, "Locator: " << *lit1 << " not present in new list"); - EPROSIMA_LOG_WARNING(RTPS_READER, "Locator Lists cannot be changed or updated in this version"); - } - } - } - - //TOPIC ATTRIBUTES - if (this->m_att.topic != att.topic) - { - EPROSIMA_LOG_WARNING(RTPS_READER, "Topic Attributes cannot be updated"); - updated &= false; - } - //QOS: - //CHECK IF THE QOS CAN BE SET - if (!this->m_att.qos.canQosBeUpdated(att.qos)) - { - updated &= false; - } - if (updated) - { - this->m_att.expectsInlineQos = att.expectsInlineQos; - if (this->m_att.qos.m_reliability.kind == RELIABLE_RELIABILITY_QOS) - { - //UPDATE TIMES: - StatefulReader* sfr = (StatefulReader*)mp_reader; - sfr->updateTimes(att.times); - } - this->m_att.qos.setQos(att.qos, false); - //NOTIFY THE BUILTIN PROTOCOLS THAT THE READER HAS CHANGED - mp_rtpsParticipant->updateReader(this->mp_reader, m_att.topic, m_att.qos); - - // Deadline - - if (m_att.qos.m_deadline.period != c_TimeInfinite) - { - deadline_duration_us_ = - duration>(m_att.qos.m_deadline.period.to_ns() * 1e-3); - deadline_timer_->update_interval_millisec(m_att.qos.m_deadline.period.to_ns() * 1e-6); - } - else - { - deadline_timer_->cancel_timer(); - } - - // Lifespan - - if (m_att.qos.m_lifespan.duration != c_TimeInfinite) - { - lifespan_duration_us_ = - std::chrono::duration>(m_att.qos.m_lifespan.duration.to_ns() * 1e-3); - lifespan_timer_->update_interval_millisec(m_att.qos.m_lifespan.duration.to_ns() * 1e-6); - } - else - { - lifespan_timer_->cancel_timer(); - } - } - - return updated; -} - -void SubscriberImpl::SubscriberReaderListener::onNewCacheChangeAdded( - RTPSReader* /*reader*/, - const CacheChange_t* const change_in) -{ - if (mp_subscriberImpl->onNewCacheChangeAdded(change_in)) - { - if (mp_subscriberImpl->mp_listener != nullptr) - { - //cout << "FIRST BYTE: "<< (int)change->serializedPayload.data[0] << endl; - mp_subscriberImpl->mp_listener->onNewDataMessage(mp_subscriberImpl->mp_userSubscriber); - } - } -} - -void SubscriberImpl::SubscriberReaderListener::onReaderMatched( - RTPSReader* /*reader*/, - MatchingInfo& info) -{ - if (this->mp_subscriberImpl->mp_listener != nullptr) - { - mp_subscriberImpl->mp_listener->onSubscriptionMatched(mp_subscriberImpl->mp_userSubscriber, info); - } -} - -void SubscriberImpl::SubscriberReaderListener::on_liveliness_changed( - RTPSReader* reader, - const LivelinessChangedStatus& status) -{ - (void)reader; - - if (mp_subscriberImpl->mp_listener != nullptr) - { - mp_subscriberImpl->mp_listener->on_liveliness_changed( - mp_subscriberImpl->mp_userSubscriber, - status); - } -} - -bool SubscriberImpl::onNewCacheChangeAdded( - const CacheChange_t* const change_in) -{ - if (m_att.qos.m_deadline.period != c_TimeInfinite) - { - std::unique_lock lock(mp_reader->getMutex()); - - if (!m_history.set_next_deadline( - change_in->instanceHandle, - steady_clock::now() + duration_cast(deadline_duration_us_))) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "Could not set next deadline in the history"); - } - else if (timer_owner_ == change_in->instanceHandle || timer_owner_ == InstanceHandle_t()) - { - if (deadline_timer_reschedule()) - { - deadline_timer_->cancel_timer(); - deadline_timer_->restart_timer(); - } - } - } - - CacheChange_t* change = (CacheChange_t*)change_in; - - if (m_att.qos.m_lifespan.duration == c_TimeInfinite) - { - return true; - } - - auto source_timestamp = system_clock::time_point() + nanoseconds(change->sourceTimestamp.to_ns()); - auto now = system_clock::now(); - - // The new change could have expired if it arrived too late - // If so, remove it from the history and return false to avoid notifying the listener - if (now - source_timestamp >= lifespan_duration_us_) - { - m_history.remove_change_sub(change); - return false; - } - - CacheChange_t* earliest_change; - if (m_history.get_earliest_change(&earliest_change)) - { - if (earliest_change == change) - { - // The new change has been added at the beginning of the the history - // As the history is sorted by timestamp, this means that the new change has the smallest timestamp - // We have to stop the timer as this will be the next change to expire - lifespan_timer_->cancel_timer(); - } - } - else - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "A change was added to history that could not be retrieved"); - } - - auto interval = source_timestamp - now + duration_cast(lifespan_duration_us_); - - // Update and restart the timer - // If the timer is already running this will not have any effect - lifespan_timer_->update_interval_millisec(interval.count() * 1e-6); - lifespan_timer_->restart_timer(); - return true; -} - -/*! - * @brief Returns there is a clean state with all Publishers. - * It occurs when the Subscriber received all samples sent by Publishers. In other words, - * its WriterProxies are up to date. - * @return There is a clean state with all Publishers. - */ -bool SubscriberImpl::isInCleanState() const -{ - return mp_reader->isInCleanState(); -} - -uint64_t SubscriberImpl::get_unread_count() const -{ - return mp_reader->get_unread_count(); -} - -bool SubscriberImpl::deadline_timer_reschedule() -{ - assert(m_att.qos.m_deadline.period != c_TimeInfinite); - - std::unique_lock lock(mp_reader->getMutex()); - - steady_clock::time_point next_deadline_us; - if (!m_history.get_next_deadline(timer_owner_, next_deadline_us)) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "Could not get the next deadline from the history"); - return false; - } - auto interval_ms = duration_cast(next_deadline_us - steady_clock::now()); - deadline_timer_->update_interval_millisec((double)interval_ms.count()); - return true; -} - -bool SubscriberImpl::deadline_missed() -{ - assert(m_att.qos.m_deadline.period != c_TimeInfinite); - - std::unique_lock lock(mp_reader->getMutex()); - - deadline_missed_status_.total_count++; - deadline_missed_status_.total_count_change++; - deadline_missed_status_.last_instance_handle = timer_owner_; - mp_listener->on_requested_deadline_missed(mp_userSubscriber, deadline_missed_status_); - deadline_missed_status_.total_count_change = 0; - - if (!m_history.set_next_deadline( - timer_owner_, - steady_clock::now() + duration_cast(deadline_duration_us_))) - { - EPROSIMA_LOG_ERROR(SUBSCRIBER, "Could not set next deadline in the history"); - return false; - } - return deadline_timer_reschedule(); -} - -void SubscriberImpl::get_requested_deadline_missed_status( - RequestedDeadlineMissedStatus& status) -{ - std::unique_lock lock(mp_reader->getMutex()); - - status = deadline_missed_status_; - deadline_missed_status_.total_count_change = 0; -} - -bool SubscriberImpl::lifespan_expired() -{ - std::unique_lock lock(mp_reader->getMutex()); - - CacheChange_t* earliest_change; - while (m_history.get_earliest_change(&earliest_change)) - { - auto source_timestamp = system_clock::time_point() + nanoseconds(earliest_change->sourceTimestamp.to_ns()); - auto now = system_clock::now(); - - // Check that the earliest change has expired (the change which started the timer could have been removed from the history) - if (now - source_timestamp < lifespan_duration_us_) - { - auto interval = source_timestamp - now + lifespan_duration_us_; - lifespan_timer_->update_interval_millisec((double)duration_cast(interval).count()); - return true; - } - - // The earliest change has expired - m_history.remove_change_sub(earliest_change); - - // Set the timer for the next change if there is one - if (!m_history.get_earliest_change(&earliest_change)) - { - return false; - } - - // Calculate when the next change is due to expire and restart - source_timestamp = system_clock::time_point() + nanoseconds(earliest_change->sourceTimestamp.to_ns()); - now = system_clock::now(); - auto interval = source_timestamp - now + lifespan_duration_us_; - - if (interval.count() > 0) - { - lifespan_timer_->update_interval_millisec((double)duration_cast(interval).count()); - return true; - } - } - - return false; -} - -void SubscriberImpl::get_liveliness_changed_status( - LivelinessChangedStatus& status) -{ - std::unique_lock lock(mp_reader->getMutex()); - - status = mp_reader->liveliness_changed_status_; - - mp_reader->liveliness_changed_status_.alive_count_change = 0u; - mp_reader->liveliness_changed_status_.not_alive_count_change = 0u; -} - -std::shared_ptr SubscriberImpl::payload_pool() -{ - return payload_pool_; -} - -void SubscriberImpl::get_listening_locators( - rtps::LocatorList_t& locators) const -{ - assert(mp_reader != nullptr); - locators.assign(mp_reader->getAttributes().unicastLocatorList); - locators.push_back(mp_reader->getAttributes().multicastLocatorList); -} - -} /* namespace fastrtps */ -} /* namespace eprosima */ diff --git a/src/cpp/fastrtps_deprecated/subscriber/SubscriberImpl.h b/src/cpp/fastrtps_deprecated/subscriber/SubscriberImpl.h deleted file mode 100644 index 49429570bfd..00000000000 --- a/src/cpp/fastrtps_deprecated/subscriber/SubscriberImpl.h +++ /dev/null @@ -1,272 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file SubscriberImpl.h - * - */ - -#ifndef SUBSCRIBERIMPL_H_ -#define SUBSCRIBERIMPL_H_ -#ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#include -#include -#include - -#include -#include -#include -#include - -#include - -#include - -namespace eprosima { -namespace fastrtps { -namespace rtps { -class RTPSReader; -class RTPSParticipant; -class TimedEvent; -} // namespace rtps - -class SubscriberListener; -class Participant; -class ParticipantImpl; -class SampleInfo_t; -class Subscriber; - -/** - * Class SubscriberImpl, contains the actual implementation of the behaviour of the Subscriber. - * @ingroup FASTRTPS_MODULE - */ -class SubscriberImpl -{ - friend class ParticipantImpl; - using LivelinessChangedStatus = eprosima::fastdds::dds::LivelinessChangedStatus; - -public: - - /** - * @param p - * @param ptype - * @param attr - * @param listen - */ - SubscriberImpl( - ParticipantImpl* p, - fastdds::dds::TopicDataType* ptype, - const SubscriberAttributes& attr, - SubscriberListener* listen = nullptr); - - virtual ~SubscriberImpl(); - - /*! - * Method to block the current thread until an unread sasmple is available. - * @param timeout maximum time the function will be blocked if any sample is received. - */ - bool wait_for_unread_samples( - const eprosima::fastrtps::Duration_t& timeout); - - - /** @name Read or take data methods. - * Methods to read or take data from the History. - */ - - ///@{ - - bool readNextData( - void* data, - SampleInfo_t* info); - bool takeNextData( - void* data, - SampleInfo_t* info); - - ///@} - - /** - * @brief Returns information about the first untaken sample. - * @param [out] info Pointer to a SampleInfo_t structure to store first untaken sample information. - * @return true if sample info was returned. false if there is no sample to take. - */ - bool get_first_untaken_info( - SampleInfo_t* info); - - /** - * Update the Attributes of the subscriber; - * @param att Reference to a SubscriberAttributes object to update the parameters; - * @return True if correctly updated, false if ANY of the updated parameters cannot be updated - */ - bool updateAttributes( - const SubscriberAttributes& att); - - /** - * Get associated GUID - * @return Associated GUID - */ - const rtps::GUID_t& getGuid(); - - /** - * Get the Attributes of the Subscriber. - * @return Attributes of the Subscriber. - */ - const SubscriberAttributes& getAttributes() const - { - return m_att; - } - - /** - * Get topic data type - * @return Topic data type - */ - fastdds::dds::TopicDataType* getType() - { - return mp_type; - } - - /*! - * @brief Returns there is a clean state with all Publishers. - * It occurs when the Subscriber received all samples sent by Publishers. In other words, - * its WriterProxies are up to date. - * @return There is a clean state with all Publishers. - */ - bool isInCleanState() const; - - /** - * Get the unread count. - * @return Unread count - */ - uint64_t get_unread_count() const; - - /** - * @brief A method called when a new cache change is added - * @param change The cache change that has been added - * @return True if the change was added (due to some QoS it could have been 'rejected') - */ - bool onNewCacheChangeAdded( - const rtps::CacheChange_t* const change); - - /** - * @brief Get the requested deadline missed status - * @return The deadline missed status - */ - void get_requested_deadline_missed_status( - RequestedDeadlineMissedStatus& status); - - /** - * @brief Returns the liveliness changed status - * @param status Liveliness changed status - */ - void get_liveliness_changed_status( - LivelinessChangedStatus& status); - - std::shared_ptr payload_pool(); - - /** - * Get the list of locators on which this subscriber is listening. - * - * @param [out] locators LocatorList_t where the list of locators will be stored. - */ - void get_listening_locators( - rtps::LocatorList_t& locators) const; - -private: - - //!Participant - ParticipantImpl* mp_participant; - - //!Pointer to associated RTPSReader - rtps::RTPSReader* mp_reader; - //! Pointer to the TopicDataType object. - fastdds::dds::TopicDataType* mp_type; - //!Attributes of the Subscriber - SubscriberAttributes m_att; - //!History - SubscriberHistory m_history; - //!Listener - SubscriberListener* mp_listener; - - class SubscriberReaderListener : public rtps::ReaderListener - { - public: - - SubscriberReaderListener( - SubscriberImpl* s) - : mp_subscriberImpl(s) - { - } - - virtual ~SubscriberReaderListener() - { - } - - void onReaderMatched( - rtps::RTPSReader* reader, - rtps::MatchingInfo& info) override; - void onNewCacheChangeAdded( - rtps::RTPSReader* reader, - const rtps::CacheChange_t* const change) override; - void on_liveliness_changed( - rtps::RTPSReader* reader, - const LivelinessChangedStatus& status) override; - SubscriberImpl* mp_subscriberImpl; - - private: - - using rtps::ReaderListener::onReaderMatched; - } - m_readerListener; - - Subscriber* mp_userSubscriber; - //!RTPSParticipant - rtps::RTPSParticipant* mp_rtpsParticipant; - - //! A timer used to check for deadlines - rtps::TimedEvent* deadline_timer_; - //! Deadline duration in microseconds - std::chrono::duration> deadline_duration_us_; - //! The current timer owner, i.e. the instance which started the deadline timer - rtps::InstanceHandle_t timer_owner_; - //! Requested deadline missed status - RequestedDeadlineMissedStatus deadline_missed_status_; - - //! A timed callback to remove expired samples - rtps::TimedEvent* lifespan_timer_; - //! The lifespan duration - std::chrono::duration> lifespan_duration_us_; - - std::shared_ptr payload_pool_; - - /** - * @brief Method called when an instance misses the deadline - */ - bool deadline_missed(); - - /** - * @brief A method to reschedule the deadline timer - */ - bool deadline_timer_reschedule(); - - /** - * @brief A method called when the lifespan timer expires - */ - bool lifespan_expired(); - -}; - - -} /* namespace fastrtps */ -} /* namespace eprosima */ -#endif // ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#endif /* SUBSCRIBERIMPL_H_ */ diff --git a/src/cpp/libfastdds.version b/src/cpp/libfastdds.version new file mode 100644 index 00000000000..a6f3ac1ca43 --- /dev/null +++ b/src/cpp/libfastdds.version @@ -0,0 +1,4 @@ +CODEABI_1.0 { + global: *eprosima*;*MD5*; + local: *; +}; diff --git a/src/cpp/libfastrtps.version b/src/cpp/libfastrtps.version deleted file mode 100644 index f2ccceb6227..00000000000 --- a/src/cpp/libfastrtps.version +++ /dev/null @@ -1,4 +0,0 @@ -CODEABI_1.0 { - global: *eprosima*;*MD5*;*dds*; - local: *; -}; diff --git a/src/cpp/rtps/RTPSDomain.cpp b/src/cpp/rtps/RTPSDomain.cpp index 20e48e89e5f..6924065774b 100644 --- a/src/cpp/rtps/RTPSDomain.cpp +++ b/src/cpp/rtps/RTPSDomain.cpp @@ -40,7 +40,6 @@ #include #include -#include #include #include #include diff --git a/src/cpp/rtps/RTPSDomainImpl.hpp b/src/cpp/rtps/RTPSDomainImpl.hpp index 1f736cd66f2..08bf31beb4b 100644 --- a/src/cpp/rtps/RTPSDomainImpl.hpp +++ b/src/cpp/rtps/RTPSDomainImpl.hpp @@ -25,13 +25,12 @@ #endif // defined(_WIN32) || defined(__unix__) #include -#include -#include -#include - -#include +#include +#include +#include #include +#include namespace eprosima { namespace fastrtps { diff --git a/src/cpp/fastrtps_deprecated/attributes/TopicAttributes.cpp b/src/cpp/rtps/attributes/TopicAttributes.cpp similarity index 100% rename from src/cpp/fastrtps_deprecated/attributes/TopicAttributes.cpp rename to src/cpp/rtps/attributes/TopicAttributes.cpp diff --git a/src/cpp/rtps/builtin/BuiltinProtocols.cpp b/src/cpp/rtps/builtin/BuiltinProtocols.cpp index 951d1ed2f8f..fa8ba368703 100644 --- a/src/cpp/rtps/builtin/BuiltinProtocols.cpp +++ b/src/cpp/rtps/builtin/BuiltinProtocols.cpp @@ -195,7 +195,7 @@ void BuiltinProtocols::filter_server_remote_locators( bool BuiltinProtocols::addLocalWriter( RTPSWriter* w, const fastrtps::TopicAttributes& topicAtt, - const fastrtps::WriterQos& wqos) + const fastdds::dds::WriterQos& wqos) { bool ok = true; @@ -229,7 +229,7 @@ bool BuiltinProtocols::addLocalWriter( bool BuiltinProtocols::addLocalReader( RTPSReader* R, const fastrtps::TopicAttributes& topicAtt, - const fastrtps::ReaderQos& rqos, + const fastdds::dds::ReaderQos& rqos, const fastdds::rtps::ContentFilterProperty* content_filter) { bool ok = true; @@ -260,7 +260,7 @@ bool BuiltinProtocols::addLocalReader( bool BuiltinProtocols::updateLocalWriter( RTPSWriter* W, const TopicAttributes& topicAtt, - const WriterQos& wqos) + const fastdds::dds::WriterQos& wqos) { bool ok = false; if (mp_PDP != nullptr && mp_PDP->getEDP() != nullptr) @@ -273,7 +273,7 @@ bool BuiltinProtocols::updateLocalWriter( bool BuiltinProtocols::updateLocalReader( RTPSReader* R, const TopicAttributes& topicAtt, - const ReaderQos& rqos, + const fastdds::dds::ReaderQos& rqos, const fastdds::rtps::ContentFilterProperty* content_filter) { bool ok = false; diff --git a/src/cpp/rtps/builtin/discovery/endpoint/EDP.cpp b/src/cpp/rtps/builtin/discovery/endpoint/EDP.cpp index 53ebb47275b..dc810abbb1c 100644 --- a/src/cpp/rtps/builtin/discovery/endpoint/EDP.cpp +++ b/src/cpp/rtps/builtin/discovery/endpoint/EDP.cpp @@ -99,7 +99,7 @@ EDP::~EDP() bool EDP::newLocalReaderProxyData( RTPSReader* reader, const TopicAttributes& att, - const ReaderQos& rqos, + const fastdds::dds::ReaderQos& rqos, const fastdds::rtps::ContentFilterProperty* content_filter) { EPROSIMA_LOG_INFO(RTPS_EDP, "Adding " << reader->getGuid().entityId << " in topic " << att.topicName); @@ -257,7 +257,7 @@ bool EDP::newLocalReaderProxyData( bool EDP::newLocalWriterProxyData( RTPSWriter* writer, const TopicAttributes& att, - const WriterQos& wqos) + const fastdds::dds::WriterQos& wqos) { EPROSIMA_LOG_INFO(RTPS_EDP, "Adding " << writer->getGuid().entityId << " in topic " << att.topicName); @@ -400,7 +400,7 @@ bool EDP::newLocalWriterProxyData( bool EDP::updatedLocalReader( RTPSReader* reader, const TopicAttributes& att, - const ReaderQos& rqos, + const fastdds::dds::ReaderQos& rqos, const fastdds::rtps::ContentFilterProperty* content_filter) { auto init_fun = [this, reader, &rqos, &att, content_filter]( @@ -514,7 +514,7 @@ bool EDP::updatedLocalReader( bool EDP::updatedLocalWriter( RTPSWriter* writer, const TopicAttributes& att, - const WriterQos& wqos) + const fastdds::dds::WriterQos& wqos) { auto init_fun = [this, writer, &wqos, &att]( WriterProxyData* wdata, diff --git a/src/cpp/rtps/builtin/discovery/endpoint/EDPSimple.cpp b/src/cpp/rtps/builtin/discovery/endpoint/EDPSimple.cpp index 521400becce..9832cdd0445 100644 --- a/src/cpp/rtps/builtin/discovery/endpoint/EDPSimple.cpp +++ b/src/cpp/rtps/builtin/discovery/endpoint/EDPSimple.cpp @@ -17,36 +17,38 @@ * */ +#include +#include +#include + #include -#include -#include -#include -#include -#include -#include +#include #include -#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include - -#include +#include +#include +#include +#include +#include #include #ifdef FASTDDS_STATISTICS #include #endif //FASTDDS_STATISTICS -#include - -#include -#include -#include - using ParameterList = eprosima::fastdds::dds::ParameterList; namespace eprosima { diff --git a/src/cpp/rtps/builtin/discovery/participant/DirectMessageSender.hpp b/src/cpp/rtps/builtin/discovery/participant/DirectMessageSender.hpp index 16326afcd9a..da25156da4b 100644 --- a/src/cpp/rtps/builtin/discovery/participant/DirectMessageSender.hpp +++ b/src/cpp/rtps/builtin/discovery/participant/DirectMessageSender.hpp @@ -17,13 +17,13 @@ * */ -#ifndef FASTRTPS_RTPS_BUILTIN_DISCOVERY_PARTICIPANT_DIRECTMESSAGESENDER_HPP_ -#define FASTRTPS_RTPS_BUILTIN_DISCOVERY_PARTICIPANT_DIRECTMESSAGESENDER_HPP_ +#ifndef FASTDDS_RTPS_BUILTIN_DISCOVERY_PARTICIPANT_DIRECTMESSAGESENDER_HPP_ +#define FASTDDS_RTPS_BUILTIN_DISCOVERY_PARTICIPANT_DIRECTMESSAGESENDER_HPP_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC #include -#include +#include namespace eprosima { namespace fastrtps { @@ -113,4 +113,4 @@ class DirectMessageSender : public RTPSMessageSenderInterface #endif // ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#endif /* FASTRTPS_RTPS_BUILTIN_DISCOVERY_PARTICIPANT_DIRECTMESSAGESENDER_HPP_ */ +#endif /* FASTDDS_RTPS_BUILTIN_DISCOVERY_PARTICIPANT_DIRECTMESSAGESENDER_HPP_ */ diff --git a/src/cpp/rtps/builtin/discovery/participant/PDPServerListener.cpp b/src/cpp/rtps/builtin/discovery/participant/PDPServerListener.cpp index 5d3dbf37169..7d40b649d4f 100644 --- a/src/cpp/rtps/builtin/discovery/participant/PDPServerListener.cpp +++ b/src/cpp/rtps/builtin/discovery/participant/PDPServerListener.cpp @@ -162,7 +162,7 @@ void PDPServerListener::onNewCacheChangeAdded( return; } - fastrtps::ParameterPropertyList_t properties = participant_data.m_properties; + fastdds::dds::ParameterPropertyList_t properties = participant_data.m_properties; /* Check DS_VERSION */ auto ds_version = std::find_if( diff --git a/src/cpp/rtps/builtin/liveliness/WLP.cpp b/src/cpp/rtps/builtin/liveliness/WLP.cpp index 7283076e2c6..aae340c9194 100644 --- a/src/cpp/rtps/builtin/liveliness/WLP.cpp +++ b/src/cpp/rtps/builtin/liveliness/WLP.cpp @@ -618,7 +618,7 @@ void WLP::removeRemoteEndpoints( bool WLP::add_local_writer( RTPSWriter* W, - const WriterQos& wqos) + const fastdds::dds::WriterQos& wqos) { std::lock_guard guard(*mp_builtinProtocols->mp_PDP->getMutex()); EPROSIMA_LOG_INFO(RTPS_LIVELINESS, W->getGuid().entityId << " to Liveliness Protocol"); @@ -821,7 +821,7 @@ bool WLP::remove_local_writer( bool WLP::add_local_reader( RTPSReader* reader, - const ReaderQos& rqos) + const fastdds::dds::ReaderQos& rqos) { std::lock_guard guard(*mp_builtinProtocols->mp_PDP->getMutex()); diff --git a/src/cpp/rtps/builtin/liveliness/WLPListener.cpp b/src/cpp/rtps/builtin/liveliness/WLPListener.cpp index 273fad11e06..aa49e8ea133 100644 --- a/src/cpp/rtps/builtin/liveliness/WLPListener.cpp +++ b/src/cpp/rtps/builtin/liveliness/WLPListener.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -37,7 +38,6 @@ #include #include #include -#include namespace eprosima { namespace fastrtps { diff --git a/src/cpp/rtps/history/HistoryAttributesExtension.hpp b/src/cpp/rtps/history/HistoryAttributesExtension.hpp index c263a1bce13..60480054172 100644 --- a/src/cpp/rtps/history/HistoryAttributesExtension.hpp +++ b/src/cpp/rtps/history/HistoryAttributesExtension.hpp @@ -17,8 +17,8 @@ * */ -#ifndef FASTRTPS_RTPS_HISTORY_HISTORYATTRIBUTESEXTENSION_HPP_ -#define FASTRTPS_RTPS_HISTORY_HISTORYATTRIBUTESEXTENSION_HPP_ +#ifndef FASTDDS_RTPS_HISTORY_HISTORYATTRIBUTESEXTENSION_HPP_ +#define FASTDDS_RTPS_HISTORY_HISTORYATTRIBUTESEXTENSION_HPP_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC @@ -34,19 +34,19 @@ static inline ResourceLimitedContainerConfig resource_limits_from_history( size_t increment = 1u) { if (history_attributes.maximumReservedCaches > 0 && - history_attributes.initialReservedCaches == history_attributes.maximumReservedCaches) + history_attributes.initialReservedCaches == history_attributes.maximumReservedCaches) { return ResourceLimitedContainerConfig::fixed_size_configuration(history_attributes.maximumReservedCaches); } return - { - history_attributes.initialReservedCaches > 0 ? + { + history_attributes.initialReservedCaches > 0 ? static_cast(history_attributes.initialReservedCaches) : 0, - history_attributes.maximumReservedCaches > 0 ? + history_attributes.maximumReservedCaches > 0 ? static_cast(history_attributes.maximumReservedCaches) : std::numeric_limits::max(), - increment > 0 ? increment : 1u - }; + increment > 0 ? increment : 1u + }; } } // namespace rtps @@ -54,4 +54,4 @@ static inline ResourceLimitedContainerConfig resource_limits_from_history( } // namespace eprosima #endif // DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#endif // FASTRTPS_RTPS_HISTORY_HISTORYATTRIBUTESEXTENSION_HPP_ +#endif // FASTDDS_RTPS_HISTORY_HISTORYATTRIBUTESEXTENSION_HPP_ diff --git a/src/cpp/rtps/messages/RTPSGapBuilder.hpp b/src/cpp/rtps/messages/RTPSGapBuilder.hpp index 94ce318f547..a9ad290361c 100644 --- a/src/cpp/rtps/messages/RTPSGapBuilder.hpp +++ b/src/cpp/rtps/messages/RTPSGapBuilder.hpp @@ -21,7 +21,7 @@ #define RTPSGAPBUILDER_HPP #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#include +#include namespace eprosima { namespace fastrtps { @@ -67,7 +67,7 @@ class RTPSGapBuilder * Adds a sequence number to the GAP list. * * @remark Sequence numbers should be added in strict increasing order. - * + * * @param gap_sequence Sequence number to be added to the GAP list. * @return false if a GAP message couldn't be added to the message group, * true if no GAP message was needed or it was successfully added. @@ -103,5 +103,5 @@ class RTPSGapBuilder } /* namespace fastrtps */ } /* namespace eprosima */ -#endif +#endif // ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC #endif /* RTPSGAPBUILDER_HPP */ diff --git a/src/cpp/rtps/messages/RTPSMessageGroup_t.hpp b/src/cpp/rtps/messages/RTPSMessageGroup_t.hpp index 75730544ef9..f1b31218440 100644 --- a/src/cpp/rtps/messages/RTPSMessageGroup_t.hpp +++ b/src/cpp/rtps/messages/RTPSMessageGroup_t.hpp @@ -21,15 +21,15 @@ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#include -#include -#include +#include +#include +#include namespace eprosima { namespace fastrtps { namespace rtps { - /** +/** * Class RTPSMessageGroup_t that contains the messages used to send multiples changes as one message. * @ingroup WRITER_MODULE */ @@ -40,14 +40,14 @@ class RTPSMessageGroup_t RTPSMessageGroup_t( #if HAVE_SECURITY bool has_security, -#endif +#endif // if HAVE_SECURITY uint32_t payload, const GuidPrefix_t& participant_guid) : rtpsmsg_submessage_(0u) , rtpsmsg_fullmsg_(0u) #if HAVE_SECURITY , rtpsmsg_encrypt_(0u) -#endif +#endif // if HAVE_SECURITY { rtpsmsg_fullmsg_.reserve(payload); rtpsmsg_submessage_.reserve(payload); @@ -57,7 +57,7 @@ class RTPSMessageGroup_t { rtpsmsg_encrypt_.reserve(payload); } -#endif +#endif // if HAVE_SECURITY init(participant_guid); } @@ -66,14 +66,14 @@ class RTPSMessageGroup_t octet* buffer_ptr, #if HAVE_SECURITY bool has_security, -#endif +#endif // if HAVE_SECURITY uint32_t payload, const GuidPrefix_t& participant_guid) : rtpsmsg_submessage_(0u) , rtpsmsg_fullmsg_(0u) #if HAVE_SECURITY , rtpsmsg_encrypt_(0u) -#endif +#endif // if HAVE_SECURITY { rtpsmsg_fullmsg_.init(buffer_ptr, payload); buffer_ptr += payload; @@ -85,7 +85,7 @@ class RTPSMessageGroup_t buffer_ptr += payload; rtpsmsg_encrypt_.init(buffer_ptr, payload); } -#endif +#endif // if HAVE_SECURITY init(participant_guid); } @@ -103,7 +103,7 @@ class RTPSMessageGroup_t #if HAVE_SECURITY CDRMessage_t rtpsmsg_encrypt_; -#endif +#endif // if HAVE_SECURITY }; } // namespace rtps diff --git a/src/cpp/rtps/messages/submessages/DataMsg.hpp b/src/cpp/rtps/messages/submessages/DataMsg.hpp index 8a295d5e5cb..65e11a48d60 100644 --- a/src/cpp/rtps/messages/submessages/DataMsg.hpp +++ b/src/cpp/rtps/messages/submessages/DataMsg.hpp @@ -17,7 +17,7 @@ * */ -#include +#include #include #include @@ -124,19 +124,21 @@ struct DataMsgUtils { if (change->write_params.related_sample_identity() != SampleIdentity::unknown()) { - fastdds::dds::ParameterSerializer::add_parameter_sample_identity(msg, - change->write_params.related_sample_identity()); - fastdds::dds::ParameterSerializer::add_parameter_custom_related_sample_identity(msg, + fastdds::dds::ParameterSerializer::add_parameter_sample_identity(msg, change->write_params.related_sample_identity()); + fastdds::dds::ParameterSerializer::add_parameter_custom_related_sample_identity( + msg, + change->write_params.related_sample_identity()); } if (WITH_KEY == topicKind && (!change->writerGUID.is_builtin() || expectsInlineQos || ALIVE != change->kind)) { - fastdds::dds::ParameterSerializer::add_parameter_key(msg, change->instanceHandle); + fastdds::dds::ParameterSerializer::add_parameter_key(msg, + change->instanceHandle); if (ALIVE != change->kind) { - fastdds::dds::ParameterSerializer::add_parameter_status(msg, status); + fastdds::dds::ParameterSerializer::add_parameter_status(msg, status); } } @@ -145,7 +147,7 @@ struct DataMsgUtils inlineQos->writeQosToCDRMessage(msg); } - fastdds::dds::ParameterSerializer::add_parameter_sentinel(msg); + fastdds::dds::ParameterSerializer::add_parameter_sentinel(msg); } }; @@ -250,10 +252,12 @@ bool RTPSMessageCreator::addSubmessageData( added_no_error &= CDRMessage::addUInt16(msg, 0); //ENCAPSULATION OPTIONS added_no_error &= - fastdds::dds::ParameterSerializer::add_parameter_key(msg, + fastdds::dds::ParameterSerializer::add_parameter_key(msg, change->instanceHandle); - added_no_error &= fastdds::dds::ParameterSerializer::add_parameter_status(msg, status); - added_no_error &= fastdds::dds::ParameterSerializer::add_parameter_sentinel(msg); + added_no_error &= + fastdds::dds::ParameterSerializer::add_parameter_status(msg, + status); + added_no_error &= fastdds::dds::ParameterSerializer::add_parameter_sentinel(msg); } // Align submessage to rtps alignment (4). diff --git a/src/cpp/rtps/network/NetworkFactory.h b/src/cpp/rtps/network/NetworkFactory.h index 1071230210b..4928af0e7f1 100644 --- a/src/cpp/rtps/network/NetworkFactory.h +++ b/src/cpp/rtps/network/NetworkFactory.h @@ -34,7 +34,7 @@ namespace rtps { class RTPSParticipantAttributes; /** - * Provides the FastRTPS library with abstract resources, which + * Provides the Fast DDS library with abstract resources, which * in turn manage the SEND and RECEIVE operations over some transport. * Once a transport is registered, it becomes invisible to the library * and is abstracted away for good. diff --git a/src/cpp/rtps/participant/RTPSParticipant.cpp b/src/cpp/rtps/participant/RTPSParticipant.cpp index f6a32273acb..1857f17fed0 100644 --- a/src/cpp/rtps/participant/RTPSParticipant.cpp +++ b/src/cpp/rtps/participant/RTPSParticipant.cpp @@ -78,7 +78,7 @@ uint32_t RTPSParticipant::getRTPSParticipantID() const bool RTPSParticipant::registerWriter( RTPSWriter* Writer, const TopicAttributes& topicAtt, - const WriterQos& wqos) + const fastdds::dds::WriterQos& wqos) { return mp_impl->registerWriter(Writer, topicAtt, wqos); } @@ -86,7 +86,7 @@ bool RTPSParticipant::registerWriter( bool RTPSParticipant::registerReader( RTPSReader* Reader, const TopicAttributes& topicAtt, - const ReaderQos& rqos, + const fastdds::dds::ReaderQos& rqos, const fastdds::rtps::ContentFilterProperty* content_filter) { return mp_impl->registerReader(Reader, topicAtt, rqos, content_filter); @@ -101,7 +101,7 @@ void RTPSParticipant::update_attributes( bool RTPSParticipant::updateWriter( RTPSWriter* Writer, const TopicAttributes& topicAtt, - const WriterQos& wqos) + const fastdds::dds::WriterQos& wqos) { return mp_impl->updateLocalWriter(Writer, topicAtt, wqos); } @@ -109,7 +109,7 @@ bool RTPSParticipant::updateWriter( bool RTPSParticipant::updateReader( RTPSReader* Reader, const TopicAttributes& topicAtt, - const ReaderQos& rqos, + const fastdds::dds::ReaderQos& rqos, const fastdds::rtps::ContentFilterProperty* content_filter) { return mp_impl->updateLocalReader(Reader, topicAtt, rqos, content_filter); diff --git a/src/cpp/rtps/participant/RTPSParticipantImpl.cpp b/src/cpp/rtps/participant/RTPSParticipantImpl.cpp index 2e8a95698e0..f7f1f49ce57 100644 --- a/src/cpp/rtps/participant/RTPSParticipantImpl.cpp +++ b/src/cpp/rtps/participant/RTPSParticipantImpl.cpp @@ -3034,7 +3034,7 @@ const fastdds::statistics::rtps::IStatusObserver* RTPSParticipantImpl::create_mo }, [&](RTPSWriter* w, const fastrtps::TopicAttributes& topicAtt, - const fastrtps::WriterQos& wqos) -> bool + const fastdds::dds::WriterQos& wqos) -> bool { return this->registerWriter(w, topicAtt, wqos); }, diff --git a/src/cpp/rtps/participant/RTPSParticipantImpl.h b/src/cpp/rtps/participant/RTPSParticipantImpl.h index 21aeed182bb..f69187b86d5 100644 --- a/src/cpp/rtps/participant/RTPSParticipantImpl.h +++ b/src/cpp/rtps/participant/RTPSParticipantImpl.h @@ -559,8 +559,6 @@ class RTPSParticipantImpl std::string guid_str_; //!Persistence guid of the RTPSParticipant GUID_t m_persistence_guid; - //! Sending resources. - DEPRECATED -Stays commented for reference purposes - // ResourceSend* mp_send_thr; //! Event Resource ResourceEvent mp_event_thr; //! BuiltinProtocols of this RTPSParticipant @@ -915,7 +913,7 @@ class RTPSParticipantImpl bool registerWriter( RTPSWriter* Writer, const TopicAttributes& topicAtt, - const WriterQos& wqos); + const fastdds::dds::WriterQos& wqos); /** * Register a Reader in the BuiltinProtocols. @@ -928,7 +926,7 @@ class RTPSParticipantImpl bool registerReader( RTPSReader* Reader, const TopicAttributes& topicAtt, - const ReaderQos& rqos, + const fastdds::dds::ReaderQos& rqos, const fastdds::rtps::ContentFilterProperty* content_filter = nullptr); /** @@ -948,7 +946,7 @@ class RTPSParticipantImpl bool updateLocalWriter( RTPSWriter* Writer, const TopicAttributes& topicAtt, - const WriterQos& wqos); + const fastdds::dds::WriterQos& wqos); /** * Update local reader QoS @@ -961,7 +959,7 @@ class RTPSParticipantImpl bool updateLocalReader( RTPSReader* Reader, const TopicAttributes& topicAtt, - const ReaderQos& rqos, + const fastdds::dds::ReaderQos& rqos, const fastdds::rtps::ContentFilterProperty* content_filter = nullptr); /** diff --git a/src/cpp/rtps/reader/ReaderHistoryState.hpp b/src/cpp/rtps/reader/ReaderHistoryState.hpp index d464333d5f8..cdac9749cb6 100644 --- a/src/cpp/rtps/reader/ReaderHistoryState.hpp +++ b/src/cpp/rtps/reader/ReaderHistoryState.hpp @@ -16,8 +16,8 @@ * @file ReaderHistoryState.hpp */ -#ifndef FASTRTPS_RTPS_READER_READERHISTORYSTATE_HPP_ -#define FASTRTPS_RTPS_READER_READERHISTORYSTATE_HPP_ +#ifndef FASTDDS_RTPS_READER_READERHISTORYSTATE_HPP_ +#define FASTDDS_RTPS_READER_READERHISTORYSTATE_HPP_ #include #include @@ -79,4 +79,4 @@ struct ReaderHistoryState } /* namespace fastrtps */ } /* namespace eprosima */ -#endif /* FASTRTPS_RTPS_READER_READERHISTORYSTATE_HPP_ */ +#endif /* FASTDDS_RTPS_READER_READERHISTORYSTATE_HPP_ */ diff --git a/src/cpp/rtps/reader/StatefulPersistentReader.cpp b/src/cpp/rtps/reader/StatefulPersistentReader.cpp index e971a68d64f..d7e958545a3 100644 --- a/src/cpp/rtps/reader/StatefulPersistentReader.cpp +++ b/src/cpp/rtps/reader/StatefulPersistentReader.cpp @@ -18,9 +18,10 @@ */ #include + #include + #include -#include #include namespace eprosima { diff --git a/src/cpp/rtps/reader/StatelessPersistentReader.cpp b/src/cpp/rtps/reader/StatelessPersistentReader.cpp index ecb9f8b5b09..d0c5f1e2c66 100644 --- a/src/cpp/rtps/reader/StatelessPersistentReader.cpp +++ b/src/cpp/rtps/reader/StatelessPersistentReader.cpp @@ -18,9 +18,10 @@ */ #include + #include + #include -#include #include namespace eprosima { diff --git a/src/cpp/rtps/reader/WriterProxy.cpp b/src/cpp/rtps/reader/WriterProxy.cpp index be9e927b19d..19243aea274 100644 --- a/src/cpp/rtps/reader/WriterProxy.cpp +++ b/src/cpp/rtps/reader/WriterProxy.cpp @@ -34,7 +34,7 @@ #include "rtps/RTPSDomainImpl.hpp" #include "utils/collections/node_size_helpers.hpp" -#if !defined(NDEBUG) && !defined(ANDROID) && defined(FASTRTPS_SOURCE) && defined(__unix__) +#if !defined(NDEBUG) && !defined(ANDROID) && defined(FASTDDS_SOURCE) && defined(__unix__) #define SHOULD_DEBUG_LINUX #endif // SHOULD_DEBUG_LINUX diff --git a/src/cpp/rtps/reader/WriterProxy.h b/src/cpp/rtps/reader/WriterProxy.h index 59f58719ea0..b9e1df14a52 100644 --- a/src/cpp/rtps/reader/WriterProxy.h +++ b/src/cpp/rtps/reader/WriterProxy.h @@ -16,8 +16,8 @@ * @file WriterProxy.h */ -#ifndef FASTRTPS_RTPS_READER_WRITERPROXY_H_ -#define FASTRTPS_RTPS_READER_WRITERPROXY_H_ +#ifndef FASTDDS_RTPS_READER_WRITERPROXY_H_ +#define FASTDDS_RTPS_READER_WRITERPROXY_H_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC #include @@ -420,11 +420,11 @@ class WriterProxy : public RTPSMessageSenderInterface using ChangeIterator = decltype(changes_received_)::iterator; -#if !defined(NDEBUG) && defined(FASTRTPS_SOURCE) && defined(__unix__) +#if !defined(NDEBUG) && defined(FASTDDS_SOURCE) && defined(__unix__) int get_mutex_owner() const; int get_thread_id() const; -#endif // if !defined(NDEBUG) && defined(FASTRTPS_SOURCE) && defined(__unix__) +#endif // if !defined(NDEBUG) && defined(FASTDDS_SOURCE) && defined(__unix__) }; } /* namespace rtps */ @@ -432,4 +432,4 @@ class WriterProxy : public RTPSMessageSenderInterface } /* namespace eprosima */ #endif // ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#endif /* FASTRTPS_RTPS_READER_WRITERPROXY_H_ */ +#endif /* FASTDDS_RTPS_READER_WRITERPROXY_H_ */ diff --git a/src/cpp/rtps/security/SecurityManager.cpp b/src/cpp/rtps/security/SecurityManager.cpp index 020b12aa2fd..27a6a23ed54 100644 --- a/src/cpp/rtps/security/SecurityManager.cpp +++ b/src/cpp/rtps/security/SecurityManager.cpp @@ -2096,8 +2096,9 @@ void SecurityManager::match_builtin_endpoints( temp_stateless_writer_proxy_data_->persistence_guid(temp_stateless_writer_proxy_data_->guid()); temp_stateless_writer_proxy_data_->set_remote_locators(participant_data.metatraffic_locators, network, false); temp_stateless_writer_proxy_data_->topicKind(NO_KEY); - temp_stateless_writer_proxy_data_->m_qos.m_reliability.kind = BEST_EFFORT_RELIABILITY_QOS; - temp_stateless_writer_proxy_data_->m_qos.m_durability.kind = VOLATILE_DURABILITY_QOS; + temp_stateless_writer_proxy_data_->m_qos.m_reliability.kind = + eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS; + temp_stateless_writer_proxy_data_->m_qos.m_durability.kind = eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS; participant_stateless_message_reader_->matched_writer_add(*temp_stateless_writer_proxy_data_); } @@ -2112,8 +2113,9 @@ void SecurityManager::match_builtin_endpoints( temp_stateless_reader_proxy_data_->guid().entityId = participant_stateless_message_reader_entity_id; temp_stateless_reader_proxy_data_->set_remote_locators(participant_data.metatraffic_locators, network, false); temp_stateless_reader_proxy_data_->topicKind(NO_KEY); - temp_stateless_reader_proxy_data_->m_qos.m_reliability.kind = BEST_EFFORT_RELIABILITY_QOS; - temp_stateless_reader_proxy_data_->m_qos.m_durability.kind = VOLATILE_DURABILITY_QOS; + temp_stateless_reader_proxy_data_->m_qos.m_reliability.kind = + eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS; + temp_stateless_reader_proxy_data_->m_qos.m_durability.kind = eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS; participant_stateless_message_writer_->matched_reader_add(*temp_stateless_reader_proxy_data_); } } @@ -2135,8 +2137,8 @@ void SecurityManager::match_builtin_key_exchange_endpoints( temp_volatile_writer_proxy_data_->persistence_guid(temp_volatile_writer_proxy_data_->guid()); temp_volatile_writer_proxy_data_->set_remote_locators(participant_data.metatraffic_locators, network, false); temp_volatile_writer_proxy_data_->topicKind(NO_KEY); - temp_volatile_writer_proxy_data_->m_qos.m_reliability.kind = RELIABLE_RELIABILITY_QOS; - temp_volatile_writer_proxy_data_->m_qos.m_durability.kind = VOLATILE_DURABILITY_QOS; + temp_volatile_writer_proxy_data_->m_qos.m_reliability.kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; + temp_volatile_writer_proxy_data_->m_qos.m_durability.kind = eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS; participant_volatile_message_secure_reader_->matched_writer_add(*temp_volatile_writer_proxy_data_); } @@ -2151,8 +2153,8 @@ void SecurityManager::match_builtin_key_exchange_endpoints( temp_volatile_reader_proxy_data_->guid().entityId = participant_volatile_message_secure_reader_entity_id; temp_volatile_reader_proxy_data_->set_remote_locators(participant_data.metatraffic_locators, network, false); temp_volatile_reader_proxy_data_->topicKind(NO_KEY); - temp_volatile_reader_proxy_data_->m_qos.m_reliability.kind = RELIABLE_RELIABILITY_QOS; - temp_volatile_reader_proxy_data_->m_qos.m_durability.kind = VOLATILE_DURABILITY_QOS; + temp_volatile_reader_proxy_data_->m_qos.m_reliability.kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; + temp_volatile_reader_proxy_data_->m_qos.m_durability.kind = eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS; participant_volatile_message_secure_writer_->matched_reader_add(*temp_volatile_reader_proxy_data_); } } diff --git a/src/cpp/rtps/security/SecurityManager.h b/src/cpp/rtps/security/SecurityManager.h index 2e3b1f9dc09..cbdff28ea50 100644 --- a/src/cpp/rtps/security/SecurityManager.h +++ b/src/cpp/rtps/security/SecurityManager.h @@ -920,7 +920,7 @@ class SecurityManager : private WriterListener std::map> associated_writers; }; - // TODO(Ricardo) Temporal. Store individual in FastRTPS code. + // TODO(Ricardo) Temporal. Store individual in Fast DDS code. std::map writer_handles_; std::map reader_handles_; diff --git a/src/cpp/rtps/transport/ChannelResource.cpp b/src/cpp/rtps/transport/ChannelResource.cpp index 83a2806db88..1f880317354 100644 --- a/src/cpp/rtps/transport/ChannelResource.cpp +++ b/src/cpp/rtps/transport/ChannelResource.cpp @@ -73,5 +73,5 @@ void ChannelResource::clear() } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/TCPAcceptor.cpp b/src/cpp/rtps/transport/TCPAcceptor.cpp index 919b725819a..2a78ed6c08a 100644 --- a/src/cpp/rtps/transport/TCPAcceptor.cpp +++ b/src/cpp/rtps/transport/TCPAcceptor.cpp @@ -50,5 +50,5 @@ TCPAcceptor::TCPAcceptor( } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/TCPAcceptorBasic.cpp b/src/cpp/rtps/transport/TCPAcceptorBasic.cpp index b1b600b0a29..493ea43fe46 100644 --- a/src/cpp/rtps/transport/TCPAcceptorBasic.cpp +++ b/src/cpp/rtps/transport/TCPAcceptorBasic.cpp @@ -63,5 +63,5 @@ void TCPAcceptorBasic::accept( } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/TCPAcceptorSecure.cpp b/src/cpp/rtps/transport/TCPAcceptorSecure.cpp index 159d34a41a4..24ca80dad99 100644 --- a/src/cpp/rtps/transport/TCPAcceptorSecure.cpp +++ b/src/cpp/rtps/transport/TCPAcceptorSecure.cpp @@ -117,5 +117,5 @@ void TCPAcceptorSecure::accept( } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/TCPChannelResource.cpp b/src/cpp/rtps/transport/TCPChannelResource.cpp index efc7a6903b9..d2d078128d2 100644 --- a/src/cpp/rtps/transport/TCPChannelResource.cpp +++ b/src/cpp/rtps/transport/TCPChannelResource.cpp @@ -371,5 +371,5 @@ bool TCPChannelResource::check_socket_send_buffer( } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/TCPChannelResourceBasic.cpp b/src/cpp/rtps/transport/TCPChannelResourceBasic.cpp index 7d885164a40..dd05985178a 100644 --- a/src/cpp/rtps/transport/TCPChannelResourceBasic.cpp +++ b/src/cpp/rtps/transport/TCPChannelResourceBasic.cpp @@ -222,5 +222,5 @@ void TCPChannelResourceBasic::shutdown( } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/TCPChannelResourceSecure.cpp b/src/cpp/rtps/transport/TCPChannelResourceSecure.cpp index bf12d09874d..6dfa3fe4dae 100644 --- a/src/cpp/rtps/transport/TCPChannelResourceSecure.cpp +++ b/src/cpp/rtps/transport/TCPChannelResourceSecure.cpp @@ -347,5 +347,5 @@ void TCPChannelResourceSecure::shutdown( } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/TCPSenderResource.hpp b/src/cpp/rtps/transport/TCPSenderResource.hpp index 6a6bcc46392..57e92e8ba89 100644 --- a/src/cpp/rtps/transport/TCPSenderResource.hpp +++ b/src/cpp/rtps/transport/TCPSenderResource.hpp @@ -106,7 +106,7 @@ class TCPSenderResource : public fastrtps::rtps::SenderResource }; } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima #endif // __TRANSPORT_UDPSENDERRESOURCE_HPP__ diff --git a/src/cpp/rtps/transport/TCPTransportInterface.cpp b/src/cpp/rtps/transport/TCPTransportInterface.cpp index d428bf4a53d..27f2cfeaa9d 100644 --- a/src/cpp/rtps/transport/TCPTransportInterface.cpp +++ b/src/cpp/rtps/transport/TCPTransportInterface.cpp @@ -37,6 +37,7 @@ #include #endif // if TLS_FOUND +#include #include #include #include @@ -49,9 +50,7 @@ #include #include #include -#include #include -#include #include #include @@ -97,7 +96,6 @@ TCPTransportDescriptor::TCPTransportDescriptor() , logical_port_increment(2) , tcp_negotiation_timeout(0) , enable_tcp_nodelay(false) - , wait_for_tcp_negotiation(false) , calculate_crc(true) , check_crc(true) , apply_security(false) @@ -116,7 +114,6 @@ TCPTransportDescriptor::TCPTransportDescriptor( , logical_port_increment(t.logical_port_increment) , tcp_negotiation_timeout(t.tcp_negotiation_timeout) , enable_tcp_nodelay(t.enable_tcp_nodelay) - , wait_for_tcp_negotiation(t.wait_for_tcp_negotiation) , calculate_crc(t.calculate_crc) , check_crc(t.check_crc) , apply_security(t.apply_security) @@ -139,7 +136,6 @@ TCPTransportDescriptor& TCPTransportDescriptor::operator =( logical_port_increment = t.logical_port_increment; tcp_negotiation_timeout = t.tcp_negotiation_timeout; enable_tcp_nodelay = t.enable_tcp_nodelay; - wait_for_tcp_negotiation = t.wait_for_tcp_negotiation; calculate_crc = t.calculate_crc; check_crc = t.check_crc; apply_security = t.apply_security; @@ -161,7 +157,6 @@ bool TCPTransportDescriptor::operator ==( this->logical_port_increment == t.logical_port_increment && this->tcp_negotiation_timeout == t.tcp_negotiation_timeout && this->enable_tcp_nodelay == t.enable_tcp_nodelay && - this->wait_for_tcp_negotiation == t.wait_for_tcp_negotiation && this->calculate_crc == t.calculate_crc && this->check_crc == t.check_crc && this->apply_security == t.apply_security && @@ -2070,5 +2065,5 @@ void TCPTransportInterface::send_channel_pending_logical_ports( } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/TCPv4Transport.cpp b/src/cpp/rtps/transport/TCPv4Transport.cpp index f96d5fdee05..9004614d420 100644 --- a/src/cpp/rtps/transport/TCPv4Transport.cpp +++ b/src/cpp/rtps/transport/TCPv4Transport.cpp @@ -540,5 +540,5 @@ bool TCPv4Transport::fillUnicastLocator( } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/TCPv6Transport.cpp b/src/cpp/rtps/transport/TCPv6Transport.cpp index 1d43b731ca7..fffa23e3866 100644 --- a/src/cpp/rtps/transport/TCPv6Transport.cpp +++ b/src/cpp/rtps/transport/TCPv6Transport.cpp @@ -510,5 +510,5 @@ bool TCPv6Transport::compare_ips( } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/UDPChannelResource.cpp b/src/cpp/rtps/transport/UDPChannelResource.cpp index 03efd8737d1..a3ea13b5ae1 100644 --- a/src/cpp/rtps/transport/UDPChannelResource.cpp +++ b/src/cpp/rtps/transport/UDPChannelResource.cpp @@ -137,5 +137,5 @@ void UDPChannelResource::release() } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/UDPSenderResource.hpp b/src/cpp/rtps/transport/UDPSenderResource.hpp index 70165141f80..5d6211d3324 100644 --- a/src/cpp/rtps/transport/UDPSenderResource.hpp +++ b/src/cpp/rtps/transport/UDPSenderResource.hpp @@ -129,7 +129,7 @@ class UDPSenderResource : public fastrtps::rtps::SenderResource }; } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima #endif // __TRANSPORT_UDPSENDERRESOURCE_HPP__ diff --git a/src/cpp/rtps/transport/UDPTransportInterface.cpp b/src/cpp/rtps/transport/UDPTransportInterface.cpp index bcf835b2d29..120af98babf 100644 --- a/src/cpp/rtps/transport/UDPTransportInterface.cpp +++ b/src/cpp/rtps/transport/UDPTransportInterface.cpp @@ -783,5 +783,5 @@ NetmaskFilterInfo UDPTransportInterface::netmask_filter_info() const } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/UDPv4Transport.cpp b/src/cpp/rtps/transport/UDPv4Transport.cpp index a941072fe34..271cf817c5f 100644 --- a/src/cpp/rtps/transport/UDPv4Transport.cpp +++ b/src/cpp/rtps/transport/UDPv4Transport.cpp @@ -720,5 +720,5 @@ void UDPv4Transport::update_network_interfaces() } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/UDPv6Transport.cpp b/src/cpp/rtps/transport/UDPv6Transport.cpp index 81ac92b5bac..0f56dc69ff5 100644 --- a/src/cpp/rtps/transport/UDPv6Transport.cpp +++ b/src/cpp/rtps/transport/UDPv6Transport.cpp @@ -708,5 +708,5 @@ void UDPv6Transport::update_network_interfaces() } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/transport/shared_mem/SharedMemChannelResource.hpp b/src/cpp/rtps/transport/shared_mem/SharedMemChannelResource.hpp index 3a110f6bb44..71045cd6de6 100644 --- a/src/cpp/rtps/transport/shared_mem/SharedMemChannelResource.hpp +++ b/src/cpp/rtps/transport/shared_mem/SharedMemChannelResource.hpp @@ -16,13 +16,12 @@ #define _FASTDDS_SHAREDMEM_CHANNEL_RESOURCE_ #include +#include #include -#include #include #include #include - #include namespace eprosima { diff --git a/src/cpp/rtps/transport/shared_mem/SharedMemTransport.cpp b/src/cpp/rtps/transport/shared_mem/SharedMemTransport.cpp index 065e3f61a9f..9e6b42f3c2a 100644 --- a/src/cpp/rtps/transport/shared_mem/SharedMemTransport.cpp +++ b/src/cpp/rtps/transport/shared_mem/SharedMemTransport.cpp @@ -24,10 +24,10 @@ #include #include +#include +#include #include #include -#include -#include #include #include @@ -37,7 +37,7 @@ #include #include -#define SHM_MANAGER_DOMAIN ("fastrtps") +#define SHM_MANAGER_DOMAIN ("fastdds") using namespace std; diff --git a/src/cpp/rtps/transport/tcp/RTCPMessageManager.cpp b/src/cpp/rtps/transport/tcp/RTCPMessageManager.cpp index 2bf2e828a73..adff93aa7d6 100644 --- a/src/cpp/rtps/transport/tcp/RTCPMessageManager.cpp +++ b/src/cpp/rtps/transport/tcp/RTCPMessageManager.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -859,5 +858,5 @@ bool RTCPMessageManager::isCompatibleProtocol( } } /* namespace rtps */ -} /* namespace fastrtps */ +} /* namespace fastdds */ } /* namespace eprosima */ diff --git a/src/cpp/rtps/transport/test_UDPv4Transport.cpp b/src/cpp/rtps/transport/test_UDPv4Transport.cpp index 18560eadd6a..3fbad4a6a6c 100644 --- a/src/cpp/rtps/transport/test_UDPv4Transport.cpp +++ b/src/cpp/rtps/transport/test_UDPv4Transport.cpp @@ -514,5 +514,5 @@ bool test_UDPv4Transport::should_be_dropped( } } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima diff --git a/src/cpp/rtps/writer/LivelinessManager.cpp b/src/cpp/rtps/writer/LivelinessManager.cpp index 42ed418dfec..09289b7d6eb 100644 --- a/src/cpp/rtps/writer/LivelinessManager.cpp +++ b/src/cpp/rtps/writer/LivelinessManager.cpp @@ -40,10 +40,10 @@ LivelinessManager::~LivelinessManager() bool LivelinessManager::add_writer( GUID_t guid, - LivelinessQosPolicyKind kind, + fastdds::dds::LivelinessQosPolicyKind kind, Duration_t lease_duration) { - if (!manage_automatic_ && kind == LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS) + if (!manage_automatic_ && kind == fastdds::dds::LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS) { EPROSIMA_LOG_WARNING(RTPS_WRITER, "Liveliness manager not managing automatic writers, writer not added"); return false; @@ -91,7 +91,7 @@ bool LivelinessManager::add_writer( bool LivelinessManager::remove_writer( GUID_t guid, - LivelinessQosPolicyKind kind, + fastdds::dds::LivelinessQosPolicyKind kind, Duration_t lease_duration) { bool removed = false; @@ -159,7 +159,7 @@ bool LivelinessManager::remove_writer( bool LivelinessManager::assert_liveliness( GUID_t guid, - LivelinessQosPolicyKind kind, + fastdds::dds::LivelinessQosPolicyKind kind, Duration_t lease_duration) { bool found = false; @@ -182,8 +182,8 @@ bool LivelinessManager::assert_liveliness( found = true; // Execute the callbacks - if (writer.kind == LivelinessQosPolicyKind::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS || - writer.kind == LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS) + if (writer.kind == fastdds::dds::LivelinessQosPolicyKind::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS || + writer.kind == fastdds::dds::LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS) { for (LivelinessData& w: writers_) { @@ -194,7 +194,7 @@ bool LivelinessManager::assert_liveliness( } } } - else if (writer.kind == LivelinessQosPolicyKind::MANUAL_BY_TOPIC_LIVELINESS_QOS) + else if (writer.kind == fastdds::dds::LivelinessQosPolicyKind::MANUAL_BY_TOPIC_LIVELINESS_QOS) { assert_writer_liveliness(writer); } @@ -233,11 +233,11 @@ bool LivelinessManager::assert_liveliness( } bool LivelinessManager::assert_liveliness( - LivelinessQosPolicyKind kind, + fastdds::dds::LivelinessQosPolicyKind kind, GuidPrefix_t guid_prefix) { - if (!manage_automatic_ && kind == LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS) + if (!manage_automatic_ && kind == fastdds::dds::LivelinessQosPolicyKind::AUTOMATIC_LIVELINESS_QOS) { EPROSIMA_LOG_WARNING(RTPS_WRITER, "Liveliness manager not managing automatic writers, writer not added"); return false; @@ -360,7 +360,7 @@ bool LivelinessManager::timer_expired() } bool LivelinessManager::is_any_alive( - LivelinessQosPolicyKind kind) + fastdds::dds::LivelinessQosPolicyKind kind) { // Keep this lock order to prevent ABBA deadlocks shared_lock _(col_mutex_); diff --git a/src/cpp/rtps/writer/PersistentWriter.cpp b/src/cpp/rtps/writer/PersistentWriter.cpp index 2a69d21704e..987159e3d51 100644 --- a/src/cpp/rtps/writer/PersistentWriter.cpp +++ b/src/cpp/rtps/writer/PersistentWriter.cpp @@ -18,10 +18,11 @@ */ #include + #include -#include -#include + #include +#include namespace eprosima { namespace fastrtps { diff --git a/src/cpp/rtps/writer/StatefulPersistentWriter.cpp b/src/cpp/rtps/writer/StatefulPersistentWriter.cpp index 459dd28a468..e2b17ca9f98 100644 --- a/src/cpp/rtps/writer/StatefulPersistentWriter.cpp +++ b/src/cpp/rtps/writer/StatefulPersistentWriter.cpp @@ -18,9 +18,10 @@ */ #include + #include + #include -#include namespace eprosima { namespace fastrtps { diff --git a/src/cpp/rtps/writer/StatelessPersistentWriter.cpp b/src/cpp/rtps/writer/StatelessPersistentWriter.cpp index 872e9a2da12..698084697ca 100644 --- a/src/cpp/rtps/writer/StatelessPersistentWriter.cpp +++ b/src/cpp/rtps/writer/StatelessPersistentWriter.cpp @@ -18,9 +18,10 @@ */ #include + #include + #include -#include namespace eprosima { namespace fastrtps { diff --git a/src/cpp/rtps/xmlparser/XMLParser.cpp b/src/cpp/rtps/xmlparser/XMLParser.cpp index 5eb211d12d3..9c27874894d 100644 --- a/src/cpp/rtps/xmlparser/XMLParser.cpp +++ b/src/cpp/rtps/xmlparser/XMLParser.cpp @@ -27,10 +27,10 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include @@ -47,7 +47,7 @@ using namespace eprosima::fastdds::xml::detail; XMLP_ret XMLParser::loadDefaultXMLFile( up_base_node_t& root) { - return loadXML(DEFAULT_FASTRTPS_PROFILES, root); + return loadXML(DEFAULT_FASTDDS_PROFILES, root); } XMLP_ret XMLParser::parseXML( @@ -296,14 +296,14 @@ XMLP_ret XMLParser::parseXMLTransportData( if (sType == UDPv4 || sType == UDPv6) { - std::shared_ptr pUDPDesc; + std::shared_ptr pUDPDesc; if (sType == UDPv4) { - pDescriptor = pUDPDesc = std::make_shared(); + pDescriptor = pUDPDesc = std::make_shared(); } else { - pDescriptor = pUDPDesc = std::make_shared(); + pDescriptor = pUDPDesc = std::make_shared(); } // Output UDP Socket @@ -327,7 +327,7 @@ XMLP_ret XMLParser::parseXMLTransportData( } else if (sType == TCPv4) { - pDescriptor = std::make_shared(); + pDescriptor = std::make_shared(); ret = parseXMLCommonTCPTransportData(p_root, pDescriptor); if (ret != XMLP_ret::XML_OK) { @@ -335,8 +335,8 @@ XMLP_ret XMLParser::parseXMLTransportData( } else { - std::shared_ptr pTCPv4Desc = - std::dynamic_pointer_cast(pDescriptor); + std::shared_ptr pTCPv4Desc = + std::dynamic_pointer_cast(pDescriptor); // Wan Address if (nullptr != (p_aux0 = p_root->FirstChildElement(TCP_WAN_ADDR))) @@ -352,7 +352,7 @@ XMLP_ret XMLParser::parseXMLTransportData( } else if (sType == TCPv6) { - pDescriptor = std::make_shared(); + pDescriptor = std::make_shared(); ret = parseXMLCommonTCPTransportData(p_root, pDescriptor); if (ret != XMLP_ret::XML_OK) { @@ -853,8 +853,8 @@ XMLP_ret XMLParser::parseXMLCommonTCPTransportData( */ XMLP_ret ret = XMLP_ret::XML_OK; - std::shared_ptr pTCPDesc = - std::dynamic_pointer_cast(p_transport); + std::shared_ptr pTCPDesc = + std::dynamic_pointer_cast(p_transport); if (pTCPDesc != nullptr) { tinyxml2::XMLElement* p_aux0 = nullptr; @@ -1160,14 +1160,14 @@ XMLP_ret XMLParser::parse_tls_config( */ using namespace rtps; - using TCPDescriptor = std::shared_ptr; - using TLSVerifyMode = TCPTransportDescriptor::TLSConfig::TLSVerifyMode; - using TLSOption = TCPTransportDescriptor::TLSConfig::TLSOptions; - using TLSHandShakeMode = TCPTransportDescriptor::TLSConfig::TLSHandShakeRole; + using TCPDescriptor = std::shared_ptr; + using TLSVerifyMode = fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSVerifyMode; + using TLSOption = fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSOptions; + using TLSHandShakeMode = fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSHandShakeRole; XMLP_ret ret = XMLP_ret::XML_OK; - TCPDescriptor pTCPDesc = std::dynamic_pointer_cast(tcp_transport); + TCPDescriptor pTCPDesc = std::dynamic_pointer_cast(tcp_transport); pTCPDesc->apply_security = true; tinyxml2::XMLElement* p_aux0 = nullptr; @@ -2065,7 +2065,7 @@ XMLP_ret XMLParser::loadXML( tinyxml2::XMLDocument xmlDoc; if (tinyxml2::XMLError::XML_SUCCESS != xmlDoc.LoadFile(filename.c_str())) { - if (filename != std::string(DEFAULT_FASTRTPS_PROFILES)) + if (filename != std::string(DEFAULT_FASTDDS_PROFILES)) { EPROSIMA_LOG_ERROR(XMLPARSER, "Error opening '" << filename << "'"); } diff --git a/src/cpp/rtps/xmlparser/XMLParserCommon.cpp b/src/cpp/rtps/xmlparser/XMLParserCommon.cpp index ef0364dd3ae..2c5292cb246 100644 --- a/src/cpp/rtps/xmlparser/XMLParserCommon.cpp +++ b/src/cpp/rtps/xmlparser/XMLParserCommon.cpp @@ -18,8 +18,8 @@ namespace eprosima { namespace fastrtps { namespace xmlparser { -const char* DEFAULT_FASTRTPS_ENV_VARIABLE = "FASTRTPS_DEFAULT_PROFILES_FILE"; -const char* DEFAULT_FASTRTPS_PROFILES = "DEFAULT_FASTRTPS_PROFILES.xml"; +const char* DEFAULT_FASTDDS_ENV_VARIABLE = "FASTDDS_DEFAULT_PROFILES_FILE"; +const char* DEFAULT_FASTDDS_PROFILES = "DEFAULT_FASTDDS_PROFILES.xml"; const char* DEFAULT_STATISTICS_DATAWRITER_PROFILE = "GENERIC_STATISTICS_PROFILE"; const char* SKIP_DEFAULT_XML_FILE = "SKIP_DEFAULT_XML_FILE"; diff --git a/src/cpp/rtps/xmlparser/XMLProfileManager.cpp b/src/cpp/rtps/xmlparser/XMLProfileManager.cpp index 5d2870f78f9..e062b001ed3 100644 --- a/src/cpp/rtps/xmlparser/XMLProfileManager.cpp +++ b/src/cpp/rtps/xmlparser/XMLProfileManager.cpp @@ -197,7 +197,7 @@ void XMLProfileManager::loadDefaultXMLFile() #ifdef _WIN32 char file_path[MAX_PATH]; size_t size = MAX_PATH; - if (getenv_s(&size, file_path, size, DEFAULT_FASTRTPS_ENV_VARIABLE) == 0 && size > 0) + if (getenv_s(&size, file_path, size, DEFAULT_FASTDDS_ENV_VARIABLE) == 0 && size > 0) { loadXMLFile(file_path); } @@ -209,11 +209,11 @@ void XMLProfileManager::loadDefaultXMLFile() // Try to load the default XML file if variable does not exist or is not set to '1' if (!(getenv_s(&size, skip_xml, size, SKIP_DEFAULT_XML_FILE) == 0 && skip_xml[0] == '1')) { - loadXMLFile(DEFAULT_FASTRTPS_PROFILES); + loadXMLFile(DEFAULT_FASTDDS_PROFILES); } #else - if (const char* file_path = std::getenv(DEFAULT_FASTRTPS_ENV_VARIABLE)) + if (const char* file_path = std::getenv(DEFAULT_FASTDDS_ENV_VARIABLE)) { loadXMLFile(file_path); } @@ -223,7 +223,7 @@ void XMLProfileManager::loadDefaultXMLFile() // Try to load the default XML file if variable does not exist or is not set to '1' if (!(skip_xml != nullptr && skip_xml[0] == '1')) { - loadXMLFile(DEFAULT_FASTRTPS_PROFILES); + loadXMLFile(DEFAULT_FASTDDS_PROFILES); } #endif // ifdef _WIN32 @@ -327,7 +327,7 @@ XMLP_ret XMLProfileManager::loadXMLFile( XMLP_ret loaded_ret = XMLParser::loadXML(filename, root_node); if (!root_node || loaded_ret != XMLP_ret::XML_OK) { - if (filename != std::string(DEFAULT_FASTRTPS_PROFILES)) + if (filename != std::string(DEFAULT_FASTDDS_PROFILES)) { EPROSIMA_LOG_ERROR(XMLPARSER, "Error parsing '" << filename << "'"); } diff --git a/src/cpp/security/accesscontrol/DistinguishedName.cpp b/src/cpp/security/accesscontrol/DistinguishedName.cpp index 3291284cdfc..65a2125fe69 100644 --- a/src/cpp/security/accesscontrol/DistinguishedName.cpp +++ b/src/cpp/security/accesscontrol/DistinguishedName.cpp @@ -19,7 +19,7 @@ #include #include -#include +#include #include diff --git a/src/cpp/statistics/fastdds/domain/DomainParticipantImpl.hpp b/src/cpp/statistics/fastdds/domain/DomainParticipantImpl.hpp index cec232c6ec0..acb01a4befc 100644 --- a/src/cpp/statistics/fastdds/domain/DomainParticipantImpl.hpp +++ b/src/cpp/statistics/fastdds/domain/DomainParticipantImpl.hpp @@ -19,7 +19,7 @@ #ifndef _FASTDDS_STADISTICS_FASTDDS_DOMAIN_DOMAINPARTICIPANTIMPL_HPP_ #define _FASTDDS_STADISTICS_FASTDDS_DOMAIN_DOMAINPARTICIPANTIMPL_HPP_ -#include +#include #ifdef FASTDDS_STATISTICS diff --git a/src/cpp/statistics/fastdds/domain/DomainParticipantStatisticsListener.hpp b/src/cpp/statistics/fastdds/domain/DomainParticipantStatisticsListener.hpp index eb45f0d8de7..7c8b2442201 100644 --- a/src/cpp/statistics/fastdds/domain/DomainParticipantStatisticsListener.hpp +++ b/src/cpp/statistics/fastdds/domain/DomainParticipantStatisticsListener.hpp @@ -19,7 +19,7 @@ #ifndef _STATISTICS_FASTDDS_DOMAIN_DOMAINPARTICIPANTSTATISTICSLISTENER_HPP #define _STATISTICS_FASTDDS_DOMAIN_DOMAINPARTICIPANTSTATISTICSLISTENER_HPP -#include +#include #ifdef FASTDDS_STATISTICS diff --git a/src/cpp/statistics/rtps/GuidUtils.hpp b/src/cpp/statistics/rtps/GuidUtils.hpp index 31dbd62eebf..8f6cecac513 100644 --- a/src/cpp/statistics/rtps/GuidUtils.hpp +++ b/src/cpp/statistics/rtps/GuidUtils.hpp @@ -19,7 +19,7 @@ #ifndef _STATISTICS_RTPS_GUIDUTILS_HPP_ #define _STATISTICS_RTPS_GUIDUTILS_HPP_ -#include +#include #include diff --git a/src/cpp/statistics/rtps/StatisticsBase.cpp b/src/cpp/statistics/rtps/StatisticsBase.cpp index 84d568a54de..5cbafa358c9 100644 --- a/src/cpp/statistics/rtps/StatisticsBase.cpp +++ b/src/cpp/statistics/rtps/StatisticsBase.cpp @@ -18,13 +18,13 @@ #include -#include - #include +#include #include +#include #include -#include + #include namespace eprosima { diff --git a/src/cpp/statistics/rtps/StatisticsBase.hpp b/src/cpp/statistics/rtps/StatisticsBase.hpp index 971e74a2402..62c32188547 100644 --- a/src/cpp/statistics/rtps/StatisticsBase.hpp +++ b/src/cpp/statistics/rtps/StatisticsBase.hpp @@ -24,18 +24,16 @@ #include #include -#include - +#include +#include #include #include #include #include -#include #include #include #include - namespace eprosima { namespace fastrtps { namespace rtps { diff --git a/src/cpp/statistics/rtps/messages/OutputTrafficManager.hpp b/src/cpp/statistics/rtps/messages/OutputTrafficManager.hpp index 175f82c4992..fa557b8c589 100644 --- a/src/cpp/statistics/rtps/messages/OutputTrafficManager.hpp +++ b/src/cpp/statistics/rtps/messages/OutputTrafficManager.hpp @@ -24,10 +24,9 @@ #include #include +#include #include -#include - #include namespace eprosima { diff --git a/src/cpp/statistics/rtps/monitor-service/MonitorService.cpp b/src/cpp/statistics/rtps/monitor-service/MonitorService.cpp index 4cbb6e29ef2..b8ba28ff434 100644 --- a/src/cpp/statistics/rtps/monitor-service/MonitorService.cpp +++ b/src/cpp/statistics/rtps/monitor-service/MonitorService.cpp @@ -467,7 +467,7 @@ bool MonitorService::create_endpoint() status_writer_ = dynamic_cast(tmp_writer); //! Register the writer in the participant - WriterQos wqos; + fastdds::dds::WriterQos wqos; wqos.m_reliability.kind = RELIABLE_RELIABILITY_QOS; wqos.m_durability.kind = dds::TRANSIENT_LOCAL_DURABILITY_QOS; diff --git a/src/cpp/statistics/rtps/monitor-service/MonitorService.hpp b/src/cpp/statistics/rtps/monitor-service/MonitorService.hpp index c9780829016..3d4a5c3f72b 100644 --- a/src/cpp/statistics/rtps/monitor-service/MonitorService.hpp +++ b/src/cpp/statistics/rtps/monitor-service/MonitorService.hpp @@ -83,7 +83,7 @@ class MonitorService using endpoint_registrator_t = std::function; + const fastdds::dds::WriterQos&)>; MonitorService( const fastrtps::rtps::GUID_t& guid, diff --git a/src/cpp/utils/Host.hpp b/src/cpp/utils/Host.hpp index 3feb9139920..7d9a3c6d402 100644 --- a/src/cpp/utils/Host.hpp +++ b/src/cpp/utils/Host.hpp @@ -15,12 +15,10 @@ #ifndef UTILS_HOST_HPP_ #define UTILS_HOST_HPP_ -#include - -#include -#include - #include +#include +#include +#include namespace eprosima { diff --git a/src/cpp/utils/System.cpp b/src/cpp/utils/System.cpp deleted file mode 100644 index 955bf618e11..00000000000 --- a/src/cpp/utils/System.cpp +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2018 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file System.cpp - */ - -#include - -#include - -namespace eprosima { -namespace fastrtps { - -int System::GetPID() -{ - return SystemInfo::instance().process_id(); -} - -} // namespace fastrtps -} // namespace eprosima diff --git a/src/cpp/utils/collections/FixedSizeQueue.hpp b/src/cpp/utils/collections/FixedSizeQueue.hpp index 80ed453364c..295a2f75774 100644 --- a/src/cpp/utils/collections/FixedSizeQueue.hpp +++ b/src/cpp/utils/collections/FixedSizeQueue.hpp @@ -17,8 +17,8 @@ * */ -#ifndef FASTRTPS_UTILS_COLLECTIONS_FIXEDSIZEQUEUE_HPP_ -#define FASTRTPS_UTILS_COLLECTIONS_FIXEDSIZEQUEUE_HPP_ +#ifndef FASTDDS_UTILS_COLLECTIONS_FIXEDSIZEQUEUE_HPP_ +#define FASTDDS_UTILS_COLLECTIONS_FIXEDSIZEQUEUE_HPP_ #include #include @@ -687,4 +687,4 @@ class FixedSizeQueue } // namespace fastrtps } // namespace eprosima -#endif /* FASTRTPS_UTILS_COLLECTIONS_FIXEDSIZEQUEUE_HPP_ */ +#endif /* FASTDDS_UTILS_COLLECTIONS_FIXEDSIZEQUEUE_HPP_ */ diff --git a/src/cpp/utils/collections/ObjectPool.hpp b/src/cpp/utils/collections/ObjectPool.hpp index 44b36784f5d..72b14ce84fc 100644 --- a/src/cpp/utils/collections/ObjectPool.hpp +++ b/src/cpp/utils/collections/ObjectPool.hpp @@ -17,8 +17,8 @@ * */ -#ifndef FASTRTPS_UTILS_COLLECTIONS_OBJECTPOOL_HPP_ -#define FASTRTPS_UTILS_COLLECTIONS_OBJECTPOOL_HPP_ +#ifndef FASTDDS_UTILS_COLLECTIONS_OBJECTPOOL_HPP_ +#define FASTDDS_UTILS_COLLECTIONS_OBJECTPOOL_HPP_ #include #include @@ -97,4 +97,4 @@ struct ObjectPool final } // namespace fastdds } // namespace eprosima -#endif /* FASTRTPS_UTILS_COLLECTIONS_OBJECTPOOL_HPP_ */ +#endif /* FASTDDS_UTILS_COLLECTIONS_OBJECTPOOL_HPP_ */ diff --git a/src/cpp/utils/collections/concurrent_queue.h b/src/cpp/utils/collections/concurrent_queue.h index c9ab42de654..43394070825 100644 --- a/src/cpp/utils/collections/concurrent_queue.h +++ b/src/cpp/utils/collections/concurrent_queue.h @@ -13,8 +13,8 @@ // limitations under the License. -#ifndef _FASTRTPS_UTILS_CONCURRENT_QUEUE_H_ -#define _FASTRTPS_UTILS_CONCURRENT_QUEUE_H_ +#ifndef _FASTDDS_UTILS_CONCURRENT_QUEUE_H_ +#define _FASTDDS_UTILS_CONCURRENT_QUEUE_H_ #include #include @@ -31,7 +31,7 @@ namespace fastrtps { * * Based on std::queue. */ -template > +template> class ConcurrentQueue final { using Queue = std::queue; @@ -113,7 +113,8 @@ class ConcurrentQueue final { std::unique_lock lock(mutex_); - has_data_.wait(lock, [&](){ + has_data_.wait(lock, [&]() + { return !queue_.empty(); }); @@ -153,4 +154,4 @@ class ConcurrentQueue final } // namespace fastrtps } // namespace eprosima -#endif // _FASTRTPS_UTILS_CONCURRENT_QUEUE_H_ +#endif // _FASTDDS_UTILS_CONCURRENT_QUEUE_H_ diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index fdc9e4158c8..93a031525d2 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -79,7 +79,8 @@ endif() if(NOT ((MSVC OR MSVC_IDE)) AND PROFILING_TESTS) find_program(CTEST_MEMORYCHECK_COMMAND NAMES valgrind) if(CTEST_MEMORYCHECK_COMMAND) - add_subdirectory(profiling) + # TODO(jlbueno) Migrate tests to Fast DDS API + # add_subdirectory(profiling) endif() endif() diff --git a/test/blackbox/CMakeLists.txt b/test/blackbox/CMakeLists.txt index ac40b155408..3791de07f81 100644 --- a/test/blackbox/CMakeLists.txt +++ b/test/blackbox/CMakeLists.txt @@ -104,7 +104,7 @@ target_compile_definitions(BlackboxTests_RTPS PRIVATE ) target_include_directories(BlackboxTests_RTPS PRIVATE ${Asio_INCLUDE_DIR}) -target_link_libraries(BlackboxTests_RTPS fastrtps fastcdr foonathan_memory GTest::gtest) +target_link_libraries(BlackboxTests_RTPS fastdds fastcdr foonathan_memory GTest::gtest) gtest_discover_tests(BlackboxTests_RTPS TEST_PREFIX "BlackboxTests_RTPS." TEST_FILTER ${BLACKBOX_HIGH_LEVEL_IGNORED_TESTS} @@ -273,7 +273,7 @@ if(FASTDDS_PIM_API_TESTS) ${Asio_INCLUDE_DIR} api/dds-pim) target_link_libraries(BlackboxTests_DDS_PIM - fastrtps + fastdds fastcdr foonathan_memory GTest::gtest diff --git a/test/blackbox/MonitorServiceConnectionList_profile.xml b/test/blackbox/MonitorServiceConnectionList_profile.xml index 89f5688d028..d16ef008d02 100644 --- a/test/blackbox/MonitorServiceConnectionList_profile.xml +++ b/test/blackbox/MonitorServiceConnectionList_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/blackbox/MonitorServiceDomainParticipant_profile.xml b/test/blackbox/MonitorServiceDomainParticipant_profile.xml index ae7eb69f9b2..5c0dd49436d 100644 --- a/test/blackbox/MonitorServiceDomainParticipant_profile.xml +++ b/test/blackbox/MonitorServiceDomainParticipant_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/blackbox/StatisticsDomainParticipant_profile.xml b/test/blackbox/StatisticsDomainParticipant_profile.xml index 2275e69b017..437aa492172 100644 --- a/test/blackbox/StatisticsDomainParticipant_profile.xml +++ b/test/blackbox/StatisticsDomainParticipant_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/blackbox/api/dds-pim/PubSubParticipant.hpp b/test/blackbox/api/dds-pim/PubSubParticipant.hpp index ceee9578df4..8712c0f34c2 100644 --- a/test/blackbox/api/dds-pim/PubSubParticipant.hpp +++ b/test/blackbox/api/dds-pim/PubSubParticipant.hpp @@ -162,8 +162,10 @@ class PubSubParticipant void on_participant_discovery( eprosima::fastdds::dds::DomainParticipant*, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) { + static_cast(should_be_ignored); bool expected = false; if (info.status == eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { diff --git a/test/blackbox/api/dds-pim/PubSubReader.hpp b/test/blackbox/api/dds-pim/PubSubReader.hpp index 5cee7b633fb..32ee2f55374 100644 --- a/test/blackbox/api/dds-pim/PubSubReader.hpp +++ b/test/blackbox/api/dds-pim/PubSubReader.hpp @@ -90,8 +90,10 @@ class PubSubReader void on_participant_discovery( eprosima::fastdds::dds::DomainParticipant*, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) override + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override { + static_cast(should_be_ignored); if (reader_.onDiscovery_ != nullptr) { std::unique_lock lock(reader_.mutexDiscovery_); @@ -205,7 +207,7 @@ class PubSubReader void on_requested_deadline_missed( eprosima::fastdds::dds::DataReader* datareader, - const eprosima::fastrtps::RequestedDeadlineMissedStatus& status) override + const eprosima::fastdds::dds::RequestedDeadlineMissedStatus& status) override { (void)datareader; @@ -222,7 +224,7 @@ class PubSubReader void on_liveliness_changed( eprosima::fastdds::dds::DataReader* datareader, - const eprosima::fastrtps::LivelinessChangedStatus& status) override + const eprosima::fastdds::dds::LivelinessChangedStatus& status) override { (void)datareader; @@ -878,7 +880,7 @@ class PubSubReader /*** Function to change QoS ***/ PubSubReader& reliability( - const eprosima::fastrtps::ReliabilityQosPolicyKind kind) + const eprosima::fastdds::dds::ReliabilityQosPolicyKind kind) { datareader_qos_.reliability().kind = kind; return *this; @@ -909,7 +911,7 @@ class PubSubReader } PubSubReader& liveliness_kind( - const eprosima::fastrtps::LivelinessQosPolicyKind& kind) + const eprosima::fastdds::dds::LivelinessQosPolicyKind& kind) { datareader_qos_.liveliness().kind = kind; return *this; @@ -950,7 +952,7 @@ class PubSubReader } PubSubReader& history_kind( - const eprosima::fastrtps::HistoryQosPolicyKind kind) + const eprosima::fastdds::dds::HistoryQosPolicyKind kind) { datareader_qos_.history().kind = kind; return *this; @@ -1314,7 +1316,7 @@ class PubSubReader } PubSubReader& durability_kind( - const eprosima::fastrtps::DurabilityQosPolicyKind kind) + const eprosima::fastdds::dds::DurabilityQosPolicyKind kind) { datareader_qos_.durability().kind = kind; return *this; @@ -1572,7 +1574,7 @@ class PubSubReader { participant_qos_.properties().properties().emplace_back("dds.persistence.plugin", "builtin.SQLITE3"); participant_qos_.properties().properties().emplace_back("dds.persistence.sqlite3.filename", filename); - datareader_qos_.durability().kind = eprosima::fastrtps::TRANSIENT_DURABILITY_QOS; + datareader_qos_.durability().kind = eprosima::fastdds::dds::TRANSIENT_DURABILITY_QOS; datareader_qos_.properties().properties().emplace_back("dds.persistence.guid", persistence_guid); return *this; @@ -1686,7 +1688,7 @@ class PubSubReader } void set_liveliness_changed_status( - const eprosima::fastrtps::LivelinessChangedStatus& status) + const eprosima::fastdds::dds::LivelinessChangedStatus& status) { std::unique_lock lock(liveliness_mutex_); @@ -1728,7 +1730,7 @@ class PubSubReader return status; } - const eprosima::fastrtps::LivelinessChangedStatus& liveliness_changed_status() + const eprosima::fastdds::dds::LivelinessChangedStatus& liveliness_changed_status() { std::unique_lock lock(liveliness_mutex_); @@ -2058,7 +2060,7 @@ class PubSubReader //! Number of times liveliness was recovered unsigned int times_liveliness_recovered_; //! The liveliness changed status - eprosima::fastrtps::LivelinessChangedStatus liveliness_changed_status_; + eprosima::fastdds::dds::LivelinessChangedStatus liveliness_changed_status_; //! A mutex for incompatible_qos status std::mutex incompatible_qos_mutex_; diff --git a/test/blackbox/api/dds-pim/PubSubWriter.hpp b/test/blackbox/api/dds-pim/PubSubWriter.hpp index d4c51199c1b..ca489b92f15 100644 --- a/test/blackbox/api/dds-pim/PubSubWriter.hpp +++ b/test/blackbox/api/dds-pim/PubSubWriter.hpp @@ -82,8 +82,10 @@ class PubSubWriter void on_participant_discovery( eprosima::fastdds::dds::DomainParticipant*, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) override + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override { + static_cast(should_be_ignored); if (writer_.onDiscovery_ != nullptr) { writer_.discovery_result_ = writer_.onDiscovery_(info); @@ -203,7 +205,7 @@ class PubSubWriter void on_offered_deadline_missed( eprosima::fastdds::dds::DataWriter* datawriter, - const eprosima::fastrtps::OfferedDeadlineMissedStatus& status) override + const eprosima::fastdds::dds::OfferedDeadlineMissedStatus& status) override { static_cast(datawriter); times_deadline_missed_ = status.total_count; @@ -219,7 +221,7 @@ class PubSubWriter void on_liveliness_lost( eprosima::fastdds::dds::DataWriter* datawriter, - const eprosima::fastrtps::LivelinessLostStatus& status) override + const eprosima::fastdds::dds::LivelinessLostStatus& status) override { static_cast(datawriter); times_liveliness_lost_ = status.total_count; @@ -832,7 +834,7 @@ class PubSubWriter /*** Function to change QoS ***/ PubSubWriter& reliability( - const eprosima::fastrtps::ReliabilityQosPolicyKind kind) + const eprosima::fastdds::dds::ReliabilityQosPolicyKind kind) { datawriter_qos_.reliability().kind = kind; return *this; @@ -853,7 +855,7 @@ class PubSubWriter } PubSubWriter& liveliness_kind( - const eprosima::fastrtps::LivelinessQosPolicyKind kind) + const eprosima::fastdds::dds::LivelinessQosPolicyKind kind) { datawriter_qos_.liveliness().kind = kind; return *this; @@ -932,14 +934,14 @@ class PubSubWriter } PubSubWriter& asynchronously( - const eprosima::fastrtps::PublishModeQosPolicyKind kind) + const eprosima::fastdds::dds::PublishModeQosPolicyKind kind) { datawriter_qos_.publish_mode().kind = kind; return *this; } PubSubWriter& history_kind( - const eprosima::fastrtps::HistoryQosPolicyKind kind) + const eprosima::fastdds::dds::HistoryQosPolicyKind kind) { datawriter_qos_.history().kind = kind; return *this; @@ -1062,7 +1064,7 @@ class PubSubWriter } PubSubWriter& durability_kind( - const eprosima::fastrtps::DurabilityQosPolicyKind kind) + const eprosima::fastdds::dds::DurabilityQosPolicyKind kind) { datawriter_qos_.durability().kind = kind; return *this; @@ -1680,7 +1682,7 @@ class PubSubWriter { participant_qos_.properties().properties().emplace_back("dds.persistence.plugin", "builtin.SQLITE3"); participant_qos_.properties().properties().emplace_back("dds.persistence.sqlite3.filename", filename); - datawriter_qos_.durability().kind = eprosima::fastrtps::TRANSIENT_DURABILITY_QOS; + datawriter_qos_.durability().kind = eprosima::fastdds::dds::TRANSIENT_DURABILITY_QOS; datawriter_qos_.properties().properties().emplace_back("dds.persistence.guid", persistence_guid); return *this; diff --git a/test/blackbox/api/dds-pim/PubSubWriterReader.hpp b/test/blackbox/api/dds-pim/PubSubWriterReader.hpp index c81ba1a0701..0c607dec261 100644 --- a/test/blackbox/api/dds-pim/PubSubWriterReader.hpp +++ b/test/blackbox/api/dds-pim/PubSubWriterReader.hpp @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #include @@ -82,9 +82,11 @@ class PubSubWriterReader #endif // if HAVE_SECURITY void on_participant_discovery( eprosima::fastdds::dds::DomainParticipant* participant, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) override + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override { - (void)participant; + static_cast(should_be_ignored); + static_cast(participant); switch (info.status) { @@ -713,42 +715,42 @@ class PubSubWriterReader #endif // if HAVE_SECURITY PubSubWriterReader& pub_durability_kind( - const eprosima::fastrtps::DurabilityQosPolicyKind kind) + const eprosima::fastdds::dds::DurabilityQosPolicyKind kind) { datawriter_qos_.durability().kind = kind; return *this; } PubSubWriterReader& sub_durability_kind( - const eprosima::fastrtps::DurabilityQosPolicyKind kind) + const eprosima::fastdds::dds::DurabilityQosPolicyKind kind) { datareader_qos_.durability().kind = kind; return *this; } PubSubWriterReader& pub_reliability( - const eprosima::fastrtps::ReliabilityQosPolicyKind kind) + const eprosima::fastdds::dds::ReliabilityQosPolicyKind kind) { datawriter_qos_.reliability().kind = kind; return *this; } PubSubWriterReader& sub_reliability( - const eprosima::fastrtps::ReliabilityQosPolicyKind kind) + const eprosima::fastdds::dds::ReliabilityQosPolicyKind kind) { datareader_qos_.reliability().kind = kind; return *this; } PubSubWriterReader& pub_history_kind( - const eprosima::fastrtps::HistoryQosPolicyKind kind) + const eprosima::fastdds::dds::HistoryQosPolicyKind kind) { datawriter_qos_.history().kind = kind; return *this; } PubSubWriterReader& sub_history_kind( - const eprosima::fastrtps::HistoryQosPolicyKind kind) + const eprosima::fastdds::dds::HistoryQosPolicyKind kind) { datareader_qos_.history().kind = kind; return *this; @@ -775,7 +777,7 @@ class PubSubWriterReader } PubSubWriterReader& add_user_transport_to_pparams( - std::shared_ptr userTransportDescriptor) + std::shared_ptr userTransportDescriptor) { participant_qos_.transport().user_transports.push_back(userTransportDescriptor); return *this; @@ -803,14 +805,14 @@ class PubSubWriterReader } PubSubWriterReader& pub_liveliness_kind( - const eprosima::fastrtps::LivelinessQosPolicyKind kind) + const eprosima::fastdds::dds::LivelinessQosPolicyKind kind) { datawriter_qos_.liveliness().kind = kind; return *this; } PubSubWriterReader& sub_liveliness_kind( - const eprosima::fastrtps::LivelinessQosPolicyKind kind) + const eprosima::fastdds::dds::LivelinessQosPolicyKind kind) { datareader_qos_.liveliness().kind = kind; return *this; @@ -894,7 +896,7 @@ class PubSubWriterReader } PubSubWriterReader& asynchronously( - const eprosima::fastrtps::PublishModeQosPolicyKind kind) + const eprosima::fastdds::dds::PublishModeQosPolicyKind kind) { datawriter_qos_.publish_mode().kind = kind; return *this; diff --git a/test/blackbox/api/dds-pim/ReqRepAsReliableHelloWorldReplier.hpp b/test/blackbox/api/dds-pim/ReqRepAsReliableHelloWorldReplier.hpp index 7a33f678b8d..a873b8802b4 100644 --- a/test/blackbox/api/dds-pim/ReqRepAsReliableHelloWorldReplier.hpp +++ b/test/blackbox/api/dds-pim/ReqRepAsReliableHelloWorldReplier.hpp @@ -30,7 +30,7 @@ class ReqRepAsReliableHelloWorldReplier : public ReqRepHelloWorldReplier void configDatareader( const std::string& suffix) override { - datareader_qos_.reliability().kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + datareader_qos_.reliability().kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; std::ostringstream t; @@ -42,7 +42,7 @@ class ReqRepAsReliableHelloWorldReplier : public ReqRepHelloWorldReplier void configDatawriter( const std::string& suffix) override { - datawriter_qos_.reliability().kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + datawriter_qos_.reliability().kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; // Increase default max_blocking_time to 1 second, as our CI infrastructure shows some // big CPU overhead sometimes diff --git a/test/blackbox/api/dds-pim/ReqRepAsReliableHelloWorldRequester.hpp b/test/blackbox/api/dds-pim/ReqRepAsReliableHelloWorldRequester.hpp index 5ac6ff5505a..9dd7302dcbd 100644 --- a/test/blackbox/api/dds-pim/ReqRepAsReliableHelloWorldRequester.hpp +++ b/test/blackbox/api/dds-pim/ReqRepAsReliableHelloWorldRequester.hpp @@ -28,7 +28,7 @@ #define GET_PID _getpid #else #define GET_PID getpid -#endif +#endif // if defined(_WIN32) class ReqRepAsReliableHelloWorldRequester : public ReqRepHelloWorldRequester { @@ -37,7 +37,7 @@ class ReqRepAsReliableHelloWorldRequester : public ReqRepHelloWorldRequester void configDatareader( const std::string& suffix) override { - datareader_qos_.reliability().kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + datareader_qos_.reliability().kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; std::ostringstream t; @@ -49,7 +49,7 @@ class ReqRepAsReliableHelloWorldRequester : public ReqRepHelloWorldRequester void configDatawriter( const std::string& suffix) override { - datawriter_qos_.reliability().kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + datawriter_qos_.reliability().kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; // Increase default max_blocking_time to 1 second, as our CI infrastructure shows some // big CPU overhead sometimes @@ -64,7 +64,7 @@ class ReqRepAsReliableHelloWorldRequester : public ReqRepHelloWorldRequester } ReqRepAsReliableHelloWorldRequester& durability_kind( - const eprosima::fastrtps::DurabilityQosPolicyKind kind) + const eprosima::fastdds::dds::DurabilityQosPolicyKind kind) { datawriter_qos_.durability().kind = kind; datareader_qos_.durability().kind = kind; diff --git a/test/blackbox/auth_handshake_props_profile.xml b/test/blackbox/auth_handshake_props_profile.xml index 7cb8d4b1421..a79746b46b7 100644 --- a/test/blackbox/auth_handshake_props_profile.xml +++ b/test/blackbox/auth_handshake_props_profile.xml @@ -1,5 +1,5 @@ - + 0 diff --git a/test/blackbox/builtin_transports_profile.xml b/test/blackbox/builtin_transports_profile.xml index 750e4391f5e..6ee611b4b9f 100644 --- a/test/blackbox/builtin_transports_profile.xml +++ b/test/blackbox/builtin_transports_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/blackbox/common/BlackboxTests.cpp b/test/blackbox/common/BlackboxTests.cpp index 55eee5beb5a..dd07dd84f66 100644 --- a/test/blackbox/common/BlackboxTests.cpp +++ b/test/blackbox/common/BlackboxTests.cpp @@ -16,7 +16,7 @@ #include -#include +#include #include #include diff --git a/test/blackbox/common/BlackboxTestsDiscovery.cpp b/test/blackbox/common/BlackboxTestsDiscovery.cpp index 6894fe523e5..95ec3b119e8 100644 --- a/test/blackbox/common/BlackboxTestsDiscovery.cpp +++ b/test/blackbox/common/BlackboxTestsDiscovery.cpp @@ -99,7 +99,7 @@ TEST_P(Discovery, ParticipantRemoval) PubSubReader reader(TEST_TOPIC_NAME); PubSubWriter writer(TEST_TOPIC_NAME); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -195,11 +195,11 @@ void static_discovery_test( LocatorBuffer.port = static_cast(MULTICAST_PORT_RANDOM_NUMBER); WriterMulticastLocators.push_back(LocatorBuffer); - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .property_policy(writer_property_policy); writer.static_discovery("file://PubSubWriter_static_disc.xml").reliability( - eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). unicastLocatorList(WriterUnicastLocators).multicastLocatorList(WriterMulticastLocators). setPublisherIDs(1, 2).setManualTopicName(std::string("BlackBox_StaticDiscovery_") + TOPIC_RANDOM_NUMBER).init(); @@ -230,9 +230,9 @@ void static_discovery_test( ReaderMulticastLocators.push_back(LocatorBuffer); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .property_policy(reader_property_policy); reader.static_discovery("file://PubSubReader_static_disc.xml"). unicastLocatorList(ReaderUnicastLocators).multicastLocatorList(ReaderMulticastLocators). @@ -325,9 +325,9 @@ TEST(Discovery, StaticDiscoveryFromString) PubSubWriter writer(TEST_TOPIC_NAME); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS); + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS); std::string writer_xml = "data://" \ "" \ "" \ @@ -354,9 +354,9 @@ TEST(Discovery, StaticDiscoveryFromString) PubSubReader reader(TEST_TOPIC_NAME); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS); + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS); std::string reader_xml = "data://" \ "" \ "" \ @@ -438,7 +438,7 @@ TEST(Discovery, EndpointRediscovery) reader.disable_builtin_transport(); reader.add_user_transport_to_pparams(testTransport); - reader.lease_duration({ 3, 0 }, { 1, 0 }).reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reader.lease_duration({ 3, 0 }, { 1, 0 }).reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -475,7 +475,7 @@ TEST(Discovery, EndpointRediscovery_2) auto testTransport = std::make_shared(); - reader.lease_duration({ 120, 0 }, { 1, 0 }).reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reader.lease_duration({ 120, 0 }, { 1, 0 }).reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -509,8 +509,8 @@ TEST(Discovery, EndpointRediscoveryWithTransientLocalData) reader .lease_duration({ 120, 0 }, { 1, 0 }) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); @@ -521,8 +521,8 @@ TEST(Discovery, EndpointRediscoveryWithTransientLocalData) writer .lease_duration({ 2, 0 }, { 1, 0 }) .history_depth(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .init(); ASSERT_TRUE(writer.isInitialized()); @@ -573,7 +573,7 @@ TEST(Discovery, ParticipantLivelinessAssertion) reader.disable_builtin_transport().add_user_transport_to_pparams(test_transport). lease_duration({ 0, 800000000 }, - { 0, 500000000 }).reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + { 0, 500000000 }).reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -658,7 +658,7 @@ TEST(Discovery, LocalInitialPeers) reader.metatraffic_unicast_locator_list(reader_default_unicast_locator). initial_peers(reader_initial_peers). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -700,7 +700,7 @@ TEST_P(Discovery, PubSubAsReliableHelloworldPartitions) reader.history_depth(10). partition("PartitionTests"). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -827,7 +827,7 @@ TEST(Discovery, LocalInitialPeersDiferrentLocators) metatraffic_unicast_locator_list(writer_metatraffic_unicast). lease_duration(c_TimeInfinite, { 3600, 0 }). initial_announcements(0, {}). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS); + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS); } // Configure reader participants: @@ -855,7 +855,7 @@ TEST(Discovery, LocalInitialPeersDiferrentLocators) initial_announcements(1, {0, 100 * 1000 * 1000}). metatraffic_unicast_locator_list(reader_metatraffic_unicast). initial_peers(reader_initial_peers). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS); + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS); } // Start writer and first reader, and wait for them to discover @@ -914,7 +914,7 @@ TEST_P(Discovery, PubSubAsReliableHelloworldParticipantDiscovery) }); reader.history_depth(100). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -954,7 +954,7 @@ TEST_P(Discovery, PubSubAsReliableHelloworldUserData) }); reader.history_depth(100). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -992,7 +992,7 @@ TEST_P(Discovery, PubSubAsReliableHelloworldEndpointUserData) }); reader.history_depth(100). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -1190,16 +1190,16 @@ TEST_P(Discovery, RepeatPubGuid) PubSubWriter writer2(TEST_TOPIC_NAME); reader - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .participant_id(2) .init(); writer - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .participant_id(1) .init(); @@ -1225,9 +1225,9 @@ TEST_P(Discovery, RepeatPubGuid) reader.wait_participant_undiscovery(); writer2 - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .participant_id(1) .init(); @@ -2155,8 +2155,10 @@ TEST(Discovery, discovery_cyclone_participant_with_custom_pid) void on_participant_discovery( DomainParticipant*, - ParticipantDiscoveryInfo&& info) override + ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override { + should_be_ignored = false; if (ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT == info.status) { discovered_participants_++; diff --git a/test/blackbox/common/BlackboxTestsKeys.cpp b/test/blackbox/common/BlackboxTestsKeys.cpp index 5e58a978b7b..7a55e9891e9 100644 --- a/test/blackbox/common/BlackboxTestsKeys.cpp +++ b/test/blackbox/common/BlackboxTestsKeys.cpp @@ -162,7 +162,7 @@ TEST(KeyedTopic, UnregisterWhenHistoryKeepAll) PubSubWriter writer(TEST_TOPIC_NAME); writer. - history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). init(); ASSERT_TRUE(writer.isInitialized()); @@ -290,14 +290,14 @@ TEST(KeyedTopic, DataWriterAlwaysSendTheSerializedKeyViaInlineQoS) writer. resource_limits_max_instances(1). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). init(); ASSERT_TRUE(writer.isInitialized()); reader. resource_limits_max_instances(1). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). init(); ASSERT_TRUE(reader.isInitialized()); @@ -341,14 +341,14 @@ TEST(KeyedTopic, DataWriterAlwaysSendTheSerializedKeyViaInlineQoS) writer. resource_limits_max_instances(1). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). init(); ASSERT_TRUE(writer.isInitialized()); reader. resource_limits_max_instances(1). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). init(); ASSERT_TRUE(reader.isInitialized()); diff --git a/test/blackbox/common/BlackboxTestsLifespanQoS.cpp b/test/blackbox/common/BlackboxTestsLifespanQoS.cpp index d27f72a2656..5c1b40fc81c 100644 --- a/test/blackbox/common/BlackboxTestsLifespanQoS.cpp +++ b/test/blackbox/common/BlackboxTestsLifespanQoS.cpp @@ -93,11 +93,11 @@ TEST_P(LifespanQos, LongLifespan) // Lifespan period in milliseconds uint32_t lifespan_ms = 10000; - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) .lifespan_period(lifespan_ms * 1e-3) .init(); - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); @@ -146,10 +146,10 @@ TEST_P(LifespanQos, ShortLifespan) // Lifespan period in milliseconds uint32_t lifespan_ms = 1; - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) .lifespan_period(lifespan_ms * 1e-3) .init(); - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) .lifespan_period(lifespan_ms * 1e-3) .init(); diff --git a/test/blackbox/common/BlackboxTestsLivelinessQos.cpp b/test/blackbox/common/BlackboxTestsLivelinessQos.cpp index 662cf66ec4e..df450a7473b 100644 --- a/test/blackbox/common/BlackboxTestsLivelinessQos.cpp +++ b/test/blackbox/common/BlackboxTestsLivelinessQos.cpp @@ -1719,7 +1719,7 @@ TEST_P(LivelinessQos, LivelinessChangedStatus_Alive_NotAlive) writer.wait_discovery(); reader.wait_discovery(); - LivelinessChangedStatus status = reader.liveliness_changed_status(); + eprosima::fastdds::dds::LivelinessChangedStatus status = reader.liveliness_changed_status(); EXPECT_EQ(status.alive_count, 0); EXPECT_EQ(status.alive_count_change, 0); EXPECT_EQ(status.not_alive_count, 0); @@ -1782,7 +1782,7 @@ TEST_P(LivelinessQos, LivelinessChangedStatus_Alive_Unmatched) writer.assert_liveliness(); reader.wait_liveliness_recovered(); - LivelinessChangedStatus status = reader.liveliness_changed_status(); + eprosima::fastdds::dds::LivelinessChangedStatus status = reader.liveliness_changed_status(); EXPECT_EQ(status.alive_count, 1); EXPECT_EQ(status.alive_count_change, 1); EXPECT_EQ(status.not_alive_count, 0); @@ -1835,7 +1835,7 @@ TEST_P(LivelinessQos, LivelinessChangedStatus_NotAlive_Unmatched) writer.assert_liveliness(); reader.wait_liveliness_recovered(); - LivelinessChangedStatus status = reader.liveliness_changed_status(); + eprosima::fastdds::dds::LivelinessChangedStatus status = reader.liveliness_changed_status(); EXPECT_EQ(status.alive_count, 1); EXPECT_EQ(status.alive_count_change, 1); EXPECT_EQ(status.not_alive_count, 0); diff --git a/test/blackbox/common/BlackboxTestsNetworkConf.cpp b/test/blackbox/common/BlackboxTestsNetworkConf.cpp index 07746f416be..4b9e97fb6b4 100644 --- a/test/blackbox/common/BlackboxTestsNetworkConf.cpp +++ b/test/blackbox/common/BlackboxTestsNetworkConf.cpp @@ -16,14 +16,14 @@ #include #include +#include +#include + #include "BlackboxTests.hpp" #include "PubSubReader.hpp" #include "PubSubWriter.hpp" #include "PubSubParticipant.hpp" -#include -#include - using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; @@ -186,8 +186,8 @@ TEST_P(NetworkConfig, PubSubOutLocatorSelection) reader.disable_builtin_transport().add_user_transport_to_pparams(descriptor_); } - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). resource_limits_allocated_samples(2). resource_limits_max_samples(2).init(); @@ -195,9 +195,9 @@ TEST_P(NetworkConfig, PubSubOutLocatorSelection) descriptor_->m_output_udp_socket = static_cast(locator.port); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).history_kind( - eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS). + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).history_kind( + eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS). resource_limits_allocated_samples(20). disable_builtin_transport(). add_user_transport_to_pparams(descriptor_). @@ -229,14 +229,14 @@ TEST_P(NetworkConfig, PubSubInterfaceWhitelistLocalhost) descriptor_->interfaceWhiteList.push_back(ip); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).history_depth(10). + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).history_depth(10). disable_multicast(0). disable_builtin_transport(). add_user_transport_to_pparams(descriptor_).init(); ASSERT_TRUE(reader.isInitialized()); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).history_depth(10). + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).history_depth(10). disable_multicast(1). disable_builtin_transport(). add_user_transport_to_pparams(descriptor_).init(); @@ -291,7 +291,7 @@ void interface_whitelist_test( } // Set the transport descriptor WITH interfaces in the writer - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).history_depth(10). + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).history_depth(10). disable_builtin_transport(). add_user_transport_to_pparams(pub_udp_descriptor).init(); @@ -322,7 +322,7 @@ void interface_whitelist_test( } // Set the transport descriptor WITH interfaces in the reader - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).history_depth(10). + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).history_depth(10). disable_builtin_transport(). add_user_transport_to_pparams(sub_udp_descriptor).init(); diff --git a/test/blackbox/common/BlackboxTestsPubSubBasic.cpp b/test/blackbox/common/BlackboxTestsPubSubBasic.cpp index 913991e1b53..03e4387bad6 100644 --- a/test/blackbox/common/BlackboxTestsPubSubBasic.cpp +++ b/test/blackbox/common/BlackboxTestsPubSubBasic.cpp @@ -149,7 +149,7 @@ TEST_P(PubSubBasic, PubSubAsNonReliableHelloworld) ASSERT_TRUE(reader.isInitialized()); - writer.reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS).init(); + writer.reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS).init(); ASSERT_TRUE(writer.isInitialized()); @@ -178,8 +178,8 @@ TEST_P(PubSubBasic, AsyncPubSubAsNonReliableHelloworld) ASSERT_TRUE(reader.isInitialized()); writer.history_depth(100). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE).init(); ASSERT_TRUE(writer.isInitialized()); @@ -204,7 +204,7 @@ TEST_P(PubSubBasic, PubSubAsReliableHelloworld) PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(100). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -235,12 +235,12 @@ TEST_P(PubSubBasic, AsyncPubSubAsReliableHelloworld) PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(100). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); writer.history_depth(100). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE).init(); + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE).init(); ASSERT_TRUE(writer.isInitialized()); @@ -291,7 +291,7 @@ TEST_P(PubSubBasic, PubSubAsReliableData64kb) PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -320,8 +320,8 @@ TEST_P(PubSubBasic, PubSubMoreThan256Unacknowledged) { PubSubWriter writer(TEST_TOPIC_NAME); - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS).init(); + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS).init(); ASSERT_TRUE(writer.isInitialized()); @@ -333,9 +333,9 @@ TEST_P(PubSubBasic, PubSubMoreThan256Unacknowledged) PubSubReader reader(TEST_TOPIC_NAME); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS).init(); + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -350,7 +350,7 @@ TEST_P(PubSubBasic, PubSubAsReliableHelloworldMulticastDisabled) PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(100). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). disable_multicast(0).init(); ASSERT_TRUE(reader.isInitialized()); @@ -392,7 +392,7 @@ TEST_P(PubSubBasic, ReceivedDynamicDataWithNoSizeLimit) reader.history_depth(100) .partition("A") - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -427,7 +427,7 @@ TEST_P(PubSubBasic, ReceivedDynamicDataWithinSizeLimit) .partitions_max_size(28) .history_depth(100) .partition("A") - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -458,7 +458,7 @@ TEST_P(PubSubBasic, ReceivedUserDataExceedsSizeLimit) reader.user_data_max_size(4) .history_depth(100) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -483,7 +483,7 @@ TEST_P(PubSubBasic, ReceivedPartitionDataExceedsSizeLimit) reader.partitions_max_size(20) .history_depth(100) .partition("A") - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -880,8 +880,8 @@ TEST_P(PubSubBasic, ReliableHelloworldLateJoinersStress) readers.emplace_back(new PubSubReader(TEST_TOPIC_NAME)); const auto& new_reader = readers.back(); - new_reader->reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + new_reader->reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .history_depth(10) .init(); ASSERT_TRUE(new_reader->isInitialized()) << " on iteration " << i; diff --git a/test/blackbox/common/BlackboxTestsPubSubFlowControllers.cpp b/test/blackbox/common/BlackboxTestsPubSubFlowControllers.cpp index 439ad1c548e..32a59f10aca 100644 --- a/test/blackbox/common/BlackboxTestsPubSubFlowControllers.cpp +++ b/test/blackbox/common/BlackboxTestsPubSubFlowControllers.cpp @@ -50,7 +50,7 @@ TEST_P(PubSubFlowControllers, AsyncPubSubAsReliableData64kbWithParticipantFlowCo PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(3). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -59,7 +59,7 @@ TEST_P(PubSubFlowControllers, AsyncPubSubAsReliableData64kbWithParticipantFlowCo writer.add_throughput_controller_descriptor_to_pparams(scheduler_policy_, bytesPerPeriod, periodInMs); writer.history_depth(3). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE).init(); + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE).init(); ASSERT_TRUE(writer.isInitialized()); @@ -86,7 +86,7 @@ TEST_P(PubSubFlowControllers, AsyncPubSubAsReliableData64kbWithParticipantFlowCo PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(3). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -99,7 +99,7 @@ TEST_P(PubSubFlowControllers, AsyncPubSubAsReliableData64kbWithParticipantFlowCo writer.add_user_transport_to_pparams(testTransport); writer.history_depth(3). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE).init(); + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE).init(); ASSERT_TRUE(writer.isInitialized()); @@ -126,14 +126,14 @@ TEST_P(PubSubFlowControllers, AsyncPubSubWithFlowController64kb) PubSubWriter slowWriter(TEST_TOPIC_NAME); reader.history_depth(2). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); uint32_t sizeToClear = 68000; //68kb uint32_t periodInMs = 1000; //1sec slowWriter.history_depth(2). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams(scheduler_policy_, sizeToClear, periodInMs).init(); ASSERT_TRUE(slowWriter.isInitialized()); @@ -165,17 +165,17 @@ TEST_P(PubSubFlowControllers, AsyncMultipleWritersFlowController64kb) // Readers configuration entities.sub_history_depth(3). - sub_durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS). - sub_reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + sub_durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS). + sub_reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); // Writers configuration. uint32_t bytesPerPeriod = 68000; uint32_t periodInMs = 500; entities.add_throughput_controller_descriptor_to_pparams(scheduler_policy_, bytesPerPeriod, periodInMs). pub_history_depth(3). - pub_durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS). - pub_reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE); + pub_durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS). + pub_reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE); // Creation. entities.init(); diff --git a/test/blackbox/common/BlackboxTestsPubSubFragments.cpp b/test/blackbox/common/BlackboxTestsPubSubFragments.cpp index 4200871f920..a0476b6bd74 100644 --- a/test/blackbox/common/BlackboxTestsPubSubFragments.cpp +++ b/test/blackbox/common/BlackboxTestsPubSubFragments.cpp @@ -98,11 +98,11 @@ class PubSubFragments : public testing::TestWithParam .socket_buffer_size(1048576) // accomodate large and fast fragments .history_depth(static_cast(data.size())) .reliability(reliable ? - eprosima::fastrtps::RELIABLE_RELIABILITY_QOS : - eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) + eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS : + eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) .durability_kind(volatile_reader ? - eprosima::fastrtps::VOLATILE_DURABILITY_QOS : - eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS : + eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); @@ -140,18 +140,18 @@ class PubSubFragments : public testing::TestWithParam if (asynchronous) { - writer.asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + writer.asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams(scheduler_policy_, 0, 0); } writer .history_depth(static_cast(data.size())) .reliability(reliable ? - eprosima::fastrtps::RELIABLE_RELIABILITY_QOS : - eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) + eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS : + eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) .durability_kind(volatile_writer ? - eprosima::fastrtps::VOLATILE_DURABILITY_QOS : - eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS : + eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .init(); ASSERT_TRUE(writer.isInitialized()); @@ -369,8 +369,8 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsNonReliableData300kbWithFlowControl) uint32_t periodInMs = 50; writer.history_depth(10). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams(scheduler_policy_, bytesPerPeriod, periodInMs).init(); ASSERT_TRUE(writer.isInitialized()); @@ -397,7 +397,7 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsReliableData300kbWithFlowControl) PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(5). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -407,7 +407,7 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsReliableData300kbWithFlowControl) uint32_t periodInMs = 50; writer.history_depth(5). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams(scheduler_policy_, bytesPerPeriod, periodInMs).init(); ASSERT_TRUE(writer.isInitialized()); @@ -435,7 +435,7 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsReliableData300kbInLossyConditions) PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(5). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -457,7 +457,7 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsReliableData300kbInLossyConditions) writer.add_user_transport_to_pparams(testTransport); writer.history_depth(5). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE).init(); + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE).init(); ASSERT_TRUE(writer.isInitialized()); @@ -489,7 +489,7 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsReliableVolatileData300kbInLossyCond PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(5). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -511,8 +511,8 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsReliableVolatileData300kbInLossyCond writer.add_user_transport_to_pparams(testTransport); writer.history_depth(5). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE).init(); + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE).init(); ASSERT_TRUE(writer.isInitialized()); @@ -544,7 +544,7 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsReliableData300kbInLossyConditionsSm PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(5). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -568,7 +568,7 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsReliableData300kbInLossyConditionsSm writer.add_user_transport_to_pparams(testTransport); writer.history_depth(5). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE).init(); + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE).init(); ASSERT_TRUE(writer.isInitialized()); @@ -600,7 +600,7 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsReliableKeyedData300kbKeepLast1InLos PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(2) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); @@ -623,7 +623,7 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsReliableKeyedData300kbKeepLast1InLos .heartbeat_period_seconds(0) .heartbeat_period_nanosec(1000000) .history_depth(1) - .asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE).init(); + .asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE).init(); ASSERT_TRUE(writer.isInitialized()); @@ -715,7 +715,7 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsReliableVolatileData300kbInLossyCond PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(5). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -739,8 +739,8 @@ TEST_P(PubSubFragmentsLimited, AsyncPubSubAsReliableVolatileData300kbInLossyCond writer.add_user_transport_to_pparams(testTransport); writer.history_depth(5). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE).init(); + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE).init(); ASSERT_TRUE(writer.isInitialized()); @@ -774,7 +774,7 @@ TEST_P(PubSubFragmentsLimited, AsyncFragmentSizeTest) PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -790,7 +790,7 @@ TEST_P(PubSubFragmentsLimited, AsyncFragmentSizeTest) testTransport->receiveBufferSize = 65536; writer.disable_builtin_transport(); writer.add_user_transport_to_pparams(testTransport); - writer.history_depth(10).asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE).init(); + writer.history_depth(10).asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE).init(); ASSERT_TRUE(writer.isInitialized()); @@ -820,7 +820,7 @@ TEST_P(PubSubFragmentsLimited, AsyncFragmentSizeTest) PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -837,7 +837,7 @@ TEST_P(PubSubFragmentsLimited, AsyncFragmentSizeTest) writer.disable_builtin_transport(); writer.add_user_transport_to_pparams(testTransport); writer.history_depth(10). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE).init(); + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE).init(); ASSERT_TRUE(writer.isInitialized()); diff --git a/test/blackbox/common/BlackboxTestsPubSubHistory.cpp b/test/blackbox/common/BlackboxTestsPubSubHistory.cpp index b0f047e95dc..11d22a04f9f 100644 --- a/test/blackbox/common/BlackboxTestsPubSubHistory.cpp +++ b/test/blackbox/common/BlackboxTestsPubSubHistory.cpp @@ -103,7 +103,7 @@ TEST_P(PubSubHistory, PubSubAsNonReliableKeepLastReaderSmallDepth) PubSubReader reader(TEST_TOPIC_NAME); PubSubWriter writer(TEST_TOPIC_NAME); - reader.history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS). + reader.history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS). history_depth(2). resource_limits_allocated_samples(2). resource_limits_max_samples(2).mem_policy(mem_policy_).init(); @@ -112,7 +112,7 @@ TEST_P(PubSubHistory, PubSubAsNonReliableKeepLastReaderSmallDepth) // Needs a deeper pool for datasharing // because reader does not process anything until everything is sent - writer.reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) + writer.reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) .resource_limits_extra_samples(10).mem_policy(mem_policy_).init(); ASSERT_TRUE(writer.isInitialized()); @@ -150,8 +150,8 @@ TEST_P(PubSubHistory, CacheChangeReleaseTest) PubSubWriter writer(TEST_TOPIC_NAME); //Reader Config - reader.reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS); - reader.history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS); + reader.reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS); + reader.history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS); reader.history_depth(1); reader.resource_limits_allocated_samples(1); reader.resource_limits_max_samples(1); @@ -190,7 +190,7 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepLastReaderSmallDepth) PubSubWriter writer(TEST_TOPIC_NAME); reader.reliability(RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS). history_depth(2). resource_limits_allocated_samples(2). resource_limits_max_samples(2).mem_policy(mem_policy_).init(); @@ -251,7 +251,7 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepLastWriterSmallDepth) ASSERT_TRUE(reader.isInitialized()); writer. - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS). history_depth(2).mem_policy(mem_policy_).init(); ASSERT_TRUE(writer.isInitialized()); @@ -279,14 +279,14 @@ TEST(PubSubHistory, PubSubKeepAll) PubSubReader reader(TEST_TOPIC_NAME); PubSubWriter writer(TEST_TOPIC_NAME); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). resource_limits_allocated_samples(2). resource_limits_max_samples(2).init(); ASSERT_TRUE(reader.isInitialized()); - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). max_blocking_time({0, 0}). resource_limits_allocated_samples(2). resource_limits_max_samples(2).init(); @@ -337,15 +337,15 @@ TEST(PubSubHistory, PubSubKeepAllTransient) PubSubReader reader(TEST_TOPIC_NAME); PubSubWriter writer(TEST_TOPIC_NAME); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). resource_limits_allocated_samples(2). resource_limits_max_samples(2).init(); ASSERT_TRUE(reader.isInitialized()); - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS). + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS). max_blocking_time({0, 0}). resource_limits_allocated_samples(2). resource_limits_max_samples(2).init(); @@ -399,8 +399,8 @@ TEST_P(PubSubHistory, PubReliableKeepAllSubNonReliable) ASSERT_TRUE(reader.isInitialized()); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). resource_limits_allocated_samples(1). resource_limits_max_samples(1).mem_policy(mem_policy_).init(); @@ -428,10 +428,10 @@ TEST_P(PubSubHistory, StatefulReaderCacheChangeRelease) PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(2). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).mem_policy(mem_policy_).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(reader.isInitialized()); writer.history_depth(2). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).mem_policy(mem_policy_).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(writer.isInitialized()); writer.wait_discovery(); @@ -474,7 +474,7 @@ TEST_P(PubSubHistory, PubSubAsReliableMultithreadKeepLast1) PubSubWriter writer(TEST_TOPIC_NAME); reader.history_depth(1). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).mem_policy(mem_policy_).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(reader.isInitialized()); @@ -522,7 +522,7 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepLastReaderSmallDepthTwoPublishers) reader .reliability(RELIABLE_RELIABILITY_QOS) - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(1) .resource_limits_allocated_samples(1) .resource_limits_max_samples(1); @@ -591,13 +591,13 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepLastWithKey) uint32_t keys = 2; reader.resource_limits_max_instances(keys). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(reader.isInitialized()); writer.resource_limits_max_instances(keys). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).mem_policy(mem_policy_).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(writer.isInitialized()); @@ -624,15 +624,15 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepAllWithKeyAndMaxSamplesPerInstance) uint32_t keys = 2; reader.resource_limits_max_instances(keys). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(reader.isInitialized()); writer.resource_limits_max_instances(keys) .resource_limits_max_samples_per_instance(1) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .mem_policy(mem_policy_).init(); ASSERT_TRUE(writer.isInitialized()); @@ -670,8 +670,8 @@ TEST(PubSubHistory, PubSubAsReliableKeepAllWithKeyAndMaxSamplesPerInstanceAndLif constexpr uint32_t samples_per_instance = 2; reader.resource_limits_max_instances(keys). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -682,8 +682,8 @@ TEST(PubSubHistory, PubSubAsReliableKeepAllWithKeyAndMaxSamplesPerInstanceAndLif writer.resource_limits_max_instances(keys) .resource_limits_max_samples_per_instance(samples_per_instance) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .max_blocking_time(max_block_time_ms * 1e-3) .lifespan_period(lifespan_ms * 1e-3) .disable_builtin_transport() @@ -730,16 +730,16 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepAllWithKeyAndInfiniteMaxSamplesPerInst uint32_t keys = 2; reader.resource_limits_max_instances(keys). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(reader.isInitialized()); writer.resource_limits_max_instances(keys) .resource_limits_max_samples(0) .resource_limits_max_samples_per_instance(0) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .mem_policy(mem_policy_).init(); ASSERT_TRUE(writer.isInitialized()); @@ -776,15 +776,15 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepAllWithKeyAndInfiniteMaxInstances) uint32_t keys = 2; reader.resource_limits_max_instances(keys). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(reader.isInitialized()); writer.resource_limits_max_samples(0) .resource_limits_max_instances(0) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .mem_policy(mem_policy_).init(); ASSERT_TRUE(writer.isInitialized()); @@ -821,8 +821,8 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepAllWithKeyAndMaxSamples) uint32_t keys = 2; reader.resource_limits_max_instances(keys). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(reader.isInitialized()); @@ -830,8 +830,8 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepAllWithKeyAndMaxSamples) .resource_limits_max_samples(4) .resource_limits_allocated_samples(2) .resource_limits_max_samples_per_instance(2) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .mem_policy(mem_policy_).init(); ASSERT_TRUE(writer.isInitialized()); @@ -865,15 +865,15 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepAllWithoutKeyAndMaxSamples) PubSubReader reader(TEST_TOPIC_NAME); PubSubWriter writer(TEST_TOPIC_NAME); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(reader.isInitialized()); writer.resource_limits_max_samples(2) .resource_limits_allocated_samples(2) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .mem_policy(mem_policy_).init(); ASSERT_TRUE(writer.isInitialized()); @@ -915,8 +915,8 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepLastReaderSmallDepthWithKey) resource_limits_allocated_samples(keys * depth). resource_limits_max_instances(keys). resource_limits_max_samples_per_instance(depth). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(reader.isInitialized()); @@ -925,7 +925,7 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepLastReaderSmallDepthWithKey) resource_limits_allocated_samples(keys * depth). resource_limits_max_instances(keys). resource_limits_max_samples_per_instance(depth). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).mem_policy(mem_policy_).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(writer.isInitialized()); @@ -964,8 +964,8 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepLastWithKeyUnorderedReception) uint32_t depth = 10; reader.resource_limits_max_instances(keys). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS). history_depth(depth).mem_policy(mem_policy_).init(); ASSERT_TRUE(reader.isInitialized()); @@ -974,8 +974,8 @@ TEST_P(PubSubHistory, PubSubAsReliableKeepLastWithKeyUnorderedReception) testTransport->dropDataMessagesPercentage = 25; writer.resource_limits_max_instances(keys). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS). history_depth(depth).mem_policy(mem_policy_). disable_builtin_transport().add_user_transport_to_pparams(testTransport). init(); @@ -1026,9 +1026,9 @@ TEST_P(PubSubHistory, ReliableTransientLocalKeepLast1) PubSubWriter writer(TEST_TOPIC_NAME); PubSubReader reader(TEST_TOPIC_NAME); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(10) .resource_limits_allocated_samples(10) .resource_limits_max_samples(10).mem_policy(mem_policy_).init(); @@ -1039,9 +1039,9 @@ TEST_P(PubSubHistory, ReliableTransientLocalKeepLast1) auto expected_data = data; writer.send(data); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(1).mem_policy(mem_policy_).init(); ASSERT_TRUE(reader.isInitialized()); @@ -1071,8 +1071,8 @@ TEST_P(PubSubHistory, ReliableTransientLocalKeepLast1Data300Kb) writer .history_depth(static_cast(data.size())) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .disable_builtin_transport().add_user_transport_to_pparams(transport) .mem_policy(mem_policy_).init(); @@ -1084,10 +1084,10 @@ TEST_P(PubSubHistory, ReliableTransientLocalKeepLast1Data300Kb) ASSERT_FALSE(reader_data.empty()); reader - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(1) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .disable_builtin_transport().add_user_transport_to_pparams(transport) .mem_policy(mem_policy_).init(); @@ -1180,7 +1180,7 @@ TEST_P(PubSubHistory, WriterUnmatchClearsHistory) reader.history_depth(2).reliability(RELIABLE_RELIABILITY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(reader.isInitialized()); - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS).mem_policy(mem_policy_).init(); + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(writer.isInitialized()); // Wait for discovery. @@ -1201,7 +1201,7 @@ TEST_P(PubSubHistory, WriterUnmatchClearsHistory) // Create another writer and send more data // Reader should be able to get the new data - writer2.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS).mem_policy(mem_policy_).init(); + writer2.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS).mem_policy(mem_policy_).init(); ASSERT_TRUE(writer2.isInitialized()); writer2.wait_discovery(); reader.wait_discovery(); @@ -1236,7 +1236,7 @@ TEST_P(PubSubHistory, KeepAllWriterContinueSendingAfterReaderMatched) reader.reliability(RELIABLE_RELIABILITY_QOS); writer.reliability(RELIABLE_RELIABILITY_QOS) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) .resource_limits_allocated_samples(1) .resource_limits_max_samples(1); @@ -1317,9 +1317,9 @@ TEST(PubSubHistory, ReliableUnmatchWithFutureChanges) const uint32_t depth = 10; - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS).history_depth(depth). + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS).history_depth(depth). init(); ASSERT_TRUE(reader.isInitialized()); @@ -1355,8 +1355,8 @@ TEST(PubSubHistory, ReliableUnmatchWithFutureChanges) return drop_heartbeat && !writer_guid.is_builtin(); }; - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS).history_depth(depth). + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS).history_depth(depth). disable_builtin_transport().add_user_transport_to_pparams(testTransport). init(); diff --git a/test/blackbox/common/BlackboxTestsRealtimeAllocations.cpp b/test/blackbox/common/BlackboxTestsRealtimeAllocations.cpp index 1ccebb749a6..eac950589c3 100644 --- a/test/blackbox/common/BlackboxTestsRealtimeAllocations.cpp +++ b/test/blackbox/common/BlackboxTestsRealtimeAllocations.cpp @@ -81,7 +81,7 @@ TEST_P(RealtimeAllocations, PubSubReliableWithLimitedSubscribers) reader .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); @@ -103,7 +103,7 @@ TEST_P(RealtimeAllocations, PubSubReliableWithLimitedSubscribers) reader2 .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .init(); ASSERT_TRUE(reader2.isInitialized()); reader2.wait_discovery(); @@ -133,13 +133,13 @@ TEST_P(RealtimeAllocations, AsyncPubSubReliableWithLimitedSubscribers) reader .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); writer - .asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE) + .asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE) .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) .matched_readers_allocation(1u, 1u) @@ -156,7 +156,7 @@ TEST_P(RealtimeAllocations, AsyncPubSubReliableWithLimitedSubscribers) reader2 .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .init(); ASSERT_TRUE(reader2.isInitialized()); reader2.wait_discovery(); @@ -193,7 +193,7 @@ TEST_P(RealtimeAllocations, PubSubBestEffortWithLimitedSubscribers) writer .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) - .reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) .matched_readers_allocation(1u, 1u) .expect_no_allocs() .init(); @@ -242,10 +242,10 @@ TEST_P(RealtimeAllocations, AsyncPubSubBestEffortWithLimitedSubscribers) ASSERT_TRUE(reader.isInitialized()); writer - .asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE) + .asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE) .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) - .reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) .matched_readers_allocation(1u, 1u) .expect_no_allocs() .init(); @@ -291,7 +291,7 @@ TEST_P(RealtimeAllocations, PubSubReliableWithLimitedPublishers) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) .matched_writers_allocation(1u, 1u) .expect_no_allocs() - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); @@ -348,13 +348,13 @@ TEST_P(RealtimeAllocations, AsyncPubSubReliableWithLimitedPublishers) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) .matched_writers_allocation(1u, 1u) .expect_no_allocs() - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); writer - .asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE) + .asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE) .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) .init(); @@ -367,7 +367,7 @@ TEST_P(RealtimeAllocations, AsyncPubSubReliableWithLimitedPublishers) // Initialize second writer and wait until it discovers the reader writer2 - .asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE) + .asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE) .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) .init(); @@ -412,7 +412,7 @@ TEST_P(RealtimeAllocations, PubSubBestEffortWithLimitedPublishers) ASSERT_TRUE(reader.isInitialized()); writer - .reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) .init(); @@ -425,7 +425,7 @@ TEST_P(RealtimeAllocations, PubSubBestEffortWithLimitedPublishers) // Initialize second writer and wait until it discovers the reader writer2 - .reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) .init(); @@ -470,8 +470,8 @@ TEST_P(RealtimeAllocations, AsyncPubSubBestEffortWithLimitedPublishers) ASSERT_TRUE(reader.isInitialized()); writer - .reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) - .asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE) + .reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) + .asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE) .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) .init(); @@ -484,8 +484,8 @@ TEST_P(RealtimeAllocations, AsyncPubSubBestEffortWithLimitedPublishers) // Initialize second writer and wait until it discovers the reader writer2 - .reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) - .asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE) + .reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) + .asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE) .history_depth(10) .resource_limits_max_samples(10).resource_limits_allocated_samples(10) .init(); diff --git a/test/blackbox/common/BlackboxTestsReliability.cpp b/test/blackbox/common/BlackboxTestsReliability.cpp index 50e37c33f42..43a26ad510a 100644 --- a/test/blackbox/common/BlackboxTestsReliability.cpp +++ b/test/blackbox/common/BlackboxTestsReliability.cpp @@ -57,8 +57,8 @@ void reliability_disable_heartbeat_piggyback( return false; }; - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(1) .heartbeat_period_seconds(180000) .disable_heartbeat_piggyback(disable_heartbeat_piggyback) @@ -67,8 +67,8 @@ void reliability_disable_heartbeat_piggyback( .init(); writer_id = writer.datawriter_guid().entityId; - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); diff --git a/test/blackbox/common/BlackboxTestsSecurity.cpp b/test/blackbox/common/BlackboxTestsSecurity.cpp index a4f9afc5a65..580ee3a0f7a 100644 --- a/test/blackbox/common/BlackboxTestsSecurity.cpp +++ b/test/blackbox/common/BlackboxTestsSecurity.cpp @@ -251,7 +251,7 @@ TEST_P(Security, BuiltinAuthenticationPlugin_PKIDH_validation_ok) "file://" + std::string(certs_path) + "/mainsubkey.pem")); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_property_policy).init(); ASSERT_TRUE(reader.isInitialized()); @@ -306,7 +306,7 @@ TEST_P(Security, BuiltinAuthenticationPlugin_PKIDH_validation_ok_same_participan property_policy.properties().emplace_back(Property("dds.sec.auth.builtin.PKI-DH.private_key", "file://" + std::string(certs_path) + "/mainpubkey.pem")); - wreader.sub_history_depth(10).sub_reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + wreader.sub_history_depth(10).sub_reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); wreader.pub_history_depth(10); wreader.property_policy(property_policy).init(); @@ -336,7 +336,7 @@ TEST_P(Security, BuiltinAuthenticationPlugin_PKIDH_validation_fail) PropertyPolicy pub_property_policy; reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); @@ -373,7 +373,7 @@ TEST_P(Security, BuiltinAuthenticationPlugin_PKIDH_validation_fail) "file://" + std::string(certs_path) + "/mainsubkey.pem")); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_property_policy).init(); ASSERT_TRUE(reader.isInitialized()); @@ -404,7 +404,7 @@ TEST_P(Security, BuiltinAuthenticationPlugin_PKIDH_lossy_conditions) "file://" + std::string(certs_path) + "/mainsubkey.pem")); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_property_policy).init(); // To simulate lossy conditions, we are going to remove the default @@ -695,7 +695,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_besteffort_rtps_ok) pub_property_policy.properties().emplace_back("rtps.participant.rtps_protection_kind", "ENCRYPT"); writer.history_depth(10). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). property_policy(pub_property_policy).init(); ASSERT_TRUE(writer.isInitialized()); @@ -767,7 +767,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_shm_transport_ok) pub_property_policy.properties().emplace_back("rtps.participant.rtps_protection_kind", "ENCRYPT"); writer.history_depth(10). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). property_policy(pub_property_policy).init(); ASSERT_TRUE(writer.isInitialized()); @@ -841,7 +841,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_shm_udp_transport_ok) pub_property_policy.properties().emplace_back("rtps.participant.rtps_protection_kind", "ENCRYPT"); writer.history_depth(10). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). property_policy(pub_property_policy).init(); ASSERT_TRUE(writer.isInitialized()); @@ -886,7 +886,7 @@ TEST(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_rtps_ok) sub_property_policy.properties().emplace_back("rtps.participant.rtps_protection_kind", "ENCRYPT"); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_property_policy).init(); ASSERT_TRUE(reader.isInitialized()); @@ -948,7 +948,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_rtps_ok_same_participant) "builtin.AES-GCM-GMAC")); property_policy.properties().emplace_back("rtps.participant.rtps_protection_kind", "ENCRYPT"); - wreader.pub_history_depth(10).sub_history_depth(10).sub_reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + wreader.pub_history_depth(10).sub_history_depth(10).sub_reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .sub_durability_kind(eprosima::fastdds::dds::DurabilityQosPolicyKind::TRANSIENT_LOCAL_DURABILITY_QOS); wreader.property_policy(property_policy).init(); @@ -1006,7 +1006,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_besteffort_large_string) pub_property_policy.properties().emplace_back("rtps.participant.rtps_protection_kind", "ENCRYPT"); writer.history_depth(10). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). property_policy(pub_property_policy).init(); ASSERT_TRUE(writer.isInitialized()); @@ -1051,7 +1051,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_rtps_large_string sub_property_policy.properties().emplace_back("rtps.participant.rtps_protection_kind", "ENCRYPT"); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_property_policy).init(); ASSERT_TRUE(reader.isInitialized()); @@ -1135,8 +1135,8 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_besteffort_rtps_data300kb) uint32_t periodInMs = 500; writer.history_depth(5). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams( eprosima::fastdds::rtps::FlowControllerSchedulerPolicy::FIFO, bytesPerPeriod, periodInMs). property_policy(pub_property_policy).init(); @@ -1183,7 +1183,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_rtps_data300kb) sub_property_policy.properties().emplace_back("rtps.participant.rtps_protection_kind", "ENCRYPT"); reader.history_depth(5). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_property_policy).init(); ASSERT_TRUE(reader.isInitialized()); @@ -1206,7 +1206,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_rtps_data300kb) uint32_t periodInMs = 50; writer.history_depth(5). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams( eprosima::fastdds::rtps::FlowControllerSchedulerPolicy::FIFO, bytesPerPeriod, periodInMs). property_policy(pub_property_policy).init(); @@ -1272,7 +1272,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_besteffort_submessage_ok) pub_property_policy.properties().emplace_back("rtps.endpoint.submessage_protection_kind", "ENCRYPT"); writer.history_depth(10). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). property_policy(pub_part_property_policy). entity_property_policy(pub_property_policy).init(); @@ -1319,7 +1319,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_submessage_ok) sub_property_policy.properties().emplace_back("rtps.endpoint.submessage_protection_kind", "ENCRYPT"); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_part_property_policy). entity_property_policy(sub_property_policy).init(); @@ -1384,7 +1384,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_submessage_ok_same_partici pub_property_policy.properties().emplace_back("rtps.endpoint.submessage_protection_kind", "ENCRYPT"); sub_property_policy.properties().emplace_back("rtps.endpoint.submessage_protection_kind", "ENCRYPT"); - wreader.pub_history_depth(10).sub_history_depth(10).sub_reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + wreader.pub_history_depth(10).sub_history_depth(10).sub_reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .sub_durability_kind(eprosima::fastdds::dds::DurabilityQosPolicyKind::TRANSIENT_LOCAL_DURABILITY_QOS); wreader.property_policy(property_policy). pub_property_policy(pub_property_policy). @@ -1446,7 +1446,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_besteffort_submessage_larg pub_property_policy.properties().emplace_back("rtps.endpoint.submessage_protection_kind", "ENCRYPT"); writer.history_depth(10). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). property_policy(pub_part_property_policy). entity_property_policy(pub_property_policy).init(); @@ -1493,7 +1493,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_submessage_large_ sub_property_policy.properties().emplace_back("rtps.endpoint.submessage_protection_kind", "ENCRYPT"); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_part_property_policy). entity_property_policy(sub_property_policy).init(); @@ -1581,8 +1581,8 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_besteffort_submessage_data uint32_t periodInMs = 500; writer.history_depth(5). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams( eprosima::fastdds::rtps::FlowControllerSchedulerPolicy::FIFO, bytesPerPeriod, periodInMs). property_policy(pub_part_property_policy). @@ -1631,7 +1631,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_submessage_data30 sub_property_policy.properties().emplace_back("rtps.endpoint.submessage_protection_kind", "ENCRYPT"); reader.history_depth(5). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_part_property_policy). entity_property_policy(sub_property_policy).init(); @@ -1655,7 +1655,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_submessage_data30 uint32_t periodInMs = 50; writer.history_depth(5). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams( eprosima::fastdds::rtps::FlowControllerSchedulerPolicy::FIFO, bytesPerPeriod, periodInMs). property_policy(pub_part_property_policy). @@ -1722,7 +1722,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_besteffort_payload_ok) pub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); writer.history_depth(10). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). property_policy(pub_part_property_policy). entity_property_policy(pub_property_policy).init(); @@ -1769,7 +1769,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_payload_ok) sub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_part_property_policy). entity_property_policy(sub_property_policy).init(); @@ -1834,7 +1834,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_payload_ok_same_participan pub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); sub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); - wreader.pub_history_depth(10).sub_history_depth(10).sub_reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + wreader.pub_history_depth(10).sub_history_depth(10).sub_reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .sub_durability_kind(eprosima::fastdds::dds::DurabilityQosPolicyKind::TRANSIENT_LOCAL_DURABILITY_QOS); wreader.property_policy(property_policy). pub_property_policy(pub_property_policy). @@ -1875,7 +1875,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_payload_ok_same_participan pub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); sub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); - wreader.pub_history_depth(10).sub_history_depth(10).sub_reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + wreader.pub_history_depth(10).sub_history_depth(10).sub_reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .sub_durability_kind(eprosima::fastdds::dds::DurabilityQosPolicyKind::TRANSIENT_LOCAL_DURABILITY_QOS); wreader.property_policy(property_policy). pub_property_policy(pub_property_policy). @@ -1937,7 +1937,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_besteffort_payload_large_s pub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); writer.history_depth(10). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). property_policy(pub_part_property_policy). entity_property_policy(pub_property_policy).init(); @@ -1984,7 +1984,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_payload_large_str sub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_part_property_policy). entity_property_policy(sub_property_policy).init(); @@ -2072,8 +2072,8 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_besteffort_payload_data300 uint32_t periodInMs = 500; writer.history_depth(5). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams( eprosima::fastdds::rtps::FlowControllerSchedulerPolicy::FIFO, bytesPerPeriod, periodInMs). property_policy(pub_part_property_policy). @@ -2122,7 +2122,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_payload_data300kb sub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); reader.history_depth(5). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_part_property_policy). entity_property_policy(sub_property_policy).init(); @@ -2146,7 +2146,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_payload_data300kb uint32_t periodInMs = 50; writer.history_depth(5). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams( eprosima::fastdds::rtps::FlowControllerSchedulerPolicy::FIFO, bytesPerPeriod, periodInMs). property_policy(pub_part_property_policy). @@ -2217,7 +2217,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_besteffort_all_ok) pub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); writer.history_depth(10). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). property_policy(pub_part_property_policy). entity_property_policy(pub_property_policy).init(); @@ -2266,7 +2266,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_all_ok) sub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_part_property_policy). entity_property_policy(sub_property_policy).init(); @@ -2355,7 +2355,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_besteffort_all_large_strin pub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); writer.history_depth(10). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). property_policy(pub_part_property_policy). entity_property_policy(pub_property_policy).init(); @@ -2404,7 +2404,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_all_large_string) sub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_part_property_policy). entity_property_policy(sub_property_policy).init(); @@ -2498,8 +2498,8 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_besteffort_all_data300kb) uint32_t periodInMs = 1000; writer.history_depth(5). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams( eprosima::fastdds::rtps::FlowControllerSchedulerPolicy::FIFO, bytesPerPeriod, periodInMs). property_policy(pub_part_property_policy). @@ -2550,7 +2550,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_all_data300kb) sub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); reader.history_depth(5). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_part_property_policy). entity_property_policy(sub_property_policy).init(); @@ -2576,7 +2576,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_all_data300kb) uint32_t periodInMs = 50; writer.history_depth(5). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams( eprosima::fastdds::rtps::FlowControllerSchedulerPolicy::FIFO, bytesPerPeriod, periodInMs). property_policy(pub_part_property_policy). @@ -2628,7 +2628,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_all_data300kb_mix sub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); reader.history_depth(5). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_part_property_policy). entity_property_policy(sub_property_policy).init(); @@ -2649,7 +2649,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_reliable_all_data300kb_mix pub_property_policy.properties().emplace_back("rtps.endpoint.payload_protection_kind", "ENCRYPT"); writer.history_depth(2).resource_limits_max_samples(2).resource_limits_allocated_samples(2). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). property_policy(pub_part_property_policy). entity_property_policy(pub_property_policy).init(); @@ -2741,7 +2741,7 @@ TEST_P(Security, BuiltinAuthenticationAndCryptoPlugin_user_data) }); reader.history_depth(100). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_part_property_policy). entity_property_policy(sub_property_policy).init(); @@ -2791,7 +2791,7 @@ TEST_P(Security, BuiltinAuthenticationAndAccessAndCryptoPlugin_governance_rule_o "file://" + std::string(certs_path) + "/permissions.smime")); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_property_policy).init(); ASSERT_TRUE(reader.isInitialized()); @@ -3072,7 +3072,7 @@ TEST_P(Security, BuiltinAuthenticationAndAccessAndCryptoPlugin_Permissions_valid "file://" + std::string(certs_path) + "/permissions_helloworld.smime")); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_property_policy).init(); ASSERT_TRUE(reader.isInitialized()); @@ -3213,7 +3213,7 @@ TEST_P(Security, BuiltinAuthenticationAndAccessAndCryptoPlugin_Permissions_valid "file://" + std::string(certs_path) + "/permissions_helloworld_partitions.smime")); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_property_policy). partition("Partition1").init(); @@ -3413,7 +3413,7 @@ void prepare_pkcs11_nodes( "file://" + std::string(certs_path) + "/permissions_helloworld.smime")); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_property_policy).init(); pub_property_policy.properties().emplace_back(Property("dds.sec.auth.plugin", @@ -3583,7 +3583,7 @@ static void BuiltinAuthenticationAndAccessAndCryptoPlugin_Permissions_validation { CommonPermissionsConfigure(reader, writer, governance_file, "permissions.smime"); - reader.history_depth(10).reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reader.history_depth(10).reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); writer.history_depth(10).init(); @@ -3811,7 +3811,7 @@ TEST(Security, AllowUnauthenticatedParticipants_TwoSecureParticipantsWithDiffere "file://" + std::string(certs_path) + "/permissions_helloworld_securehelloworld_other_ca.smime")); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_property_policy).init(); ASSERT_TRUE(reader.isInitialized()); @@ -3836,7 +3836,7 @@ TEST(Security, AllowUnauthenticatedParticipants_TwoSecureParticipantsWithDiffere "file://" + std::string(certs_path) + "/permissions_helloworld_securehelloworld.smime")); writer.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(pub_property_policy).init(); ASSERT_TRUE(writer.isInitialized()); @@ -3894,7 +3894,7 @@ TEST(Security, AllowUnauthenticatedParticipants_TwoParticipantsDifferentCertific "file://" + std::string(certs_path) + "/permissions_helloworld_securehelloworld_other_ca.smime")); reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(sub_property_policy).init(); ASSERT_TRUE(reader.isInitialized()); @@ -3919,7 +3919,7 @@ TEST(Security, AllowUnauthenticatedParticipants_TwoParticipantsDifferentCertific "file://" + std::string(certs_path) + "/permissions_helloworld_securehelloworld.smime")); writer.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). property_policy(pub_property_policy).init(); ASSERT_TRUE(writer.isInitialized()); @@ -3950,17 +3950,17 @@ TEST(Security, InANonSecureParticipantWithTwoSecureParticipantScenario_TheTwoSec CommonPermissionsConfigure(secure_reader, secure_writer, governance_file, permissions_file); secure_writer.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(secure_writer.isInitialized()); non_secure_reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(non_secure_reader.isInitialized()); secure_reader.history_depth(10). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(secure_reader.isInitialized()); @@ -4738,8 +4738,8 @@ TEST(Security, MaliciousHeartbeatIgnore) reader.add_to_unicast_locator_list("127.0.0.1", 7000); // Set common QoS - reader.history_depth(10).reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); - writer.history_depth(10).reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + reader.history_depth(10).reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); + writer.history_depth(10).reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); // Configure security const std::string governance_file("governance_helloworld_all_enable.smime"); @@ -4851,8 +4851,8 @@ TEST_P(Security, MaliciousParticipantRemovalIgnore) }; // Set common QoS - reader.history_depth(10).reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); - writer.history_depth(10).reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + reader.history_depth(10).reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); + writer.history_depth(10).reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); // Configure security const std::string governance_file("governance_helloworld_all_enable.smime"); diff --git a/test/blackbox/common/BlackboxTestsTransportCustom.cpp b/test/blackbox/common/BlackboxTestsTransportCustom.cpp index 6c65d2a3f8d..f0ebca33fcf 100644 --- a/test/blackbox/common/BlackboxTestsTransportCustom.cpp +++ b/test/blackbox/common/BlackboxTestsTransportCustom.cpp @@ -231,11 +231,11 @@ class BuiltinTransportsTest PubSubReader reader(TEST_TOPIC_NAME); // Reliable keep all to wait of all acked as end condition - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS); + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS); + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS); // Builtin transport configuration according to test_case switch (test_case) @@ -360,7 +360,7 @@ TEST(ChainingTransportTests, basic_test) reader.disable_builtin_transport() .add_user_transport_to_pparams(reader_transport) .property_policy(test_property_policy) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); @@ -469,7 +469,7 @@ TEST(ChainingTransportTests, tcp_client_server_with_wan_correct_sender_resources reader.disable_builtin_transport() .add_user_transport_to_pparams(reader_transport) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .property_policy(test_property_policy) .metatraffic_unicast_locator_list(reader_locators) .set_default_unicast_locators(reader_locators) diff --git a/test/blackbox/common/BlackboxTestsTransportSHM.cpp b/test/blackbox/common/BlackboxTestsTransportSHM.cpp index ae971bd35d3..71bc97a30c4 100644 --- a/test/blackbox/common/BlackboxTestsTransportSHM.cpp +++ b/test/blackbox/common/BlackboxTestsTransportSHM.cpp @@ -46,11 +46,11 @@ TEST(SHM, TransportPubSub) auto testTransport = std::make_shared(); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); writer.disable_builtin_transport(). add_user_transport_to_pparams(testTransport).init(); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); reader.disable_builtin_transport(). add_user_transport_to_pparams(testTransport).init(); @@ -151,19 +151,19 @@ TEST(SHM, IgnoreNonExistentSegment) PubSubWriter writer(TEST_TOPIC_NAME); writer - .asynchronously(eprosima::fastrtps::SYNCHRONOUS_PUBLISH_MODE) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) + .asynchronously(eprosima::fastdds::dds::SYNCHRONOUS_PUBLISH_MODE) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) .disable_builtin_transport() .add_user_transport_to_pparams(std::make_shared()) .init(); ASSERT_TRUE(writer.isInitialized()); reader - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) .disable_builtin_transport() .add_user_transport_to_pparams(std::make_shared()) .init(); @@ -192,8 +192,8 @@ TEST(SHM, IgnoreNonExistentSegment) { PubSubWriter late_writer(TEST_TOPIC_NAME); late_writer - .asynchronously(eprosima::fastrtps::SYNCHRONOUS_PUBLISH_MODE) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .asynchronously(eprosima::fastdds::dds::SYNCHRONOUS_PUBLISH_MODE) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .disable_builtin_transport() .add_user_transport_to_pparams(std::make_shared()) .init(); @@ -240,14 +240,14 @@ TEST(SHM, Test300KFragmentation) shm_transport->big_buffer_size_recv_count_ = &big_buffers_recv_count; writer - .asynchronously(eprosima::fastrtps::SYNCHRONOUS_PUBLISH_MODE) - .reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) + .asynchronously(eprosima::fastdds::dds::SYNCHRONOUS_PUBLISH_MODE) + .reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) .disable_builtin_transport() .add_user_transport_to_pparams(shm_transport) .init(); reader - .reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) .disable_builtin_transport() .add_user_transport_to_pparams(shm_transport) .init(); @@ -292,14 +292,14 @@ TEST(SHM, Test300KNoFragmentation) shm_transport->big_buffer_size_recv_count_ = &big_buffers_recv_count; writer - .asynchronously(eprosima::fastrtps::SYNCHRONOUS_PUBLISH_MODE) - .reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) + .asynchronously(eprosima::fastdds::dds::SYNCHRONOUS_PUBLISH_MODE) + .reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) .disable_builtin_transport() .add_user_transport_to_pparams(shm_transport) .init(); reader - .reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS) .disable_builtin_transport() .add_user_transport_to_pparams(shm_transport) .init(); @@ -351,15 +351,15 @@ TEST(SHM, SHM_UDP_300KFragmentation) shm_transport->big_buffer_size_send_count_ = &big_buffers_send_count; shm_transport->big_buffer_size_recv_count_ = &big_buffers_recv_count; - writer.asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + writer.asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE); + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); writer .disable_builtin_transport() .add_user_transport_to_pparams(shm_transport) .add_user_transport_to_pparams(udp_transport) .init(); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); reader .disable_builtin_transport() .add_user_transport_to_pparams(shm_transport) @@ -415,14 +415,14 @@ TEST(SHM, UDPvsSHM_UDP) shm_transport->big_buffer_size_send_count_ = &big_buffers_send_count; shm_transport->big_buffer_size_recv_count_ = &big_buffers_recv_count; - writer.asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + writer.asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE); + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); writer .disable_builtin_transport() .add_user_transport_to_pparams(udp_transport) .init(); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); reader .disable_builtin_transport() .add_user_transport_to_pparams(shm_transport) @@ -471,15 +471,15 @@ TEST(SHM, SHM_UDPvsUDP) auto udp_transport = std::make_shared(); - writer.asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + writer.asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE); + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); writer .disable_builtin_transport() .add_user_transport_to_pparams(shm_transport) .add_user_transport_to_pparams(udp_transport) .init(); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); reader .disable_builtin_transport() .add_user_transport_to_pparams(udp_transport) diff --git a/test/blackbox/common/BlackboxTestsTransportTCP.cpp b/test/blackbox/common/BlackboxTestsTransportTCP.cpp index 80897508aec..538e65898a8 100644 --- a/test/blackbox/common/BlackboxTestsTransportTCP.cpp +++ b/test/blackbox/common/BlackboxTestsTransportTCP.cpp @@ -20,8 +20,8 @@ #include -#include -#include +#include +#include #include "../api/dds-pim/TCPReqRepHelloWorldRequester.hpp" #include "../api/dds-pim/TCPReqRepHelloWorldReplier.hpp" @@ -51,11 +51,11 @@ class TransportTCP : public testing::TestWithParam(); + test_transport_ = std::make_shared(); } else { - test_transport_ = std::make_shared(); + test_transport_ = std::make_shared(); } } @@ -64,7 +64,7 @@ class TransportTCP : public testing::TestWithParam test_transport_; + std::shared_ptr test_transport_; }; // TCP and Domain management with logical ports tests @@ -528,8 +528,8 @@ TEST_P(TransportTCP, TCPLocalhost) TEST_P(TransportTCP, TCPv4_equal_operator) { // TCPv4TransportDescriptor - TCPv4TransportDescriptor tcpv4_transport_1; - TCPv4TransportDescriptor tcpv4_transport_2; + eprosima::fastdds::rtps::TCPv4TransportDescriptor tcpv4_transport_1; + eprosima::fastdds::rtps::TCPv4TransportDescriptor tcpv4_transport_2; // Compare equal in defult values ASSERT_EQ(tcpv4_transport_1, tcpv4_transport_2); @@ -548,15 +548,15 @@ TEST_P(TransportTCP, TCPv4_equal_operator) // Test copy constructor and copy assignment for TCPv4 TEST_P(TransportTCP, TCPv4_copy) { - TCPv4TransportDescriptor tcpv4_transport; + eprosima::fastdds::rtps::TCPv4TransportDescriptor tcpv4_transport; tcpv4_transport.set_WAN_address("80.80.99.45"); // Copy constructor - TCPv4TransportDescriptor tcpv4_transport_copy_constructor(tcpv4_transport); + eprosima::fastdds::rtps::TCPv4TransportDescriptor tcpv4_transport_copy_constructor(tcpv4_transport); EXPECT_EQ(tcpv4_transport, tcpv4_transport_copy_constructor); // Copy assignment - TCPv4TransportDescriptor tcpv4_transport_copy = tcpv4_transport; + eprosima::fastdds::rtps::TCPv4TransportDescriptor tcpv4_transport_copy = tcpv4_transport; EXPECT_EQ(tcpv4_transport_copy, tcpv4_transport); } @@ -564,7 +564,7 @@ TEST_P(TransportTCP, TCPv4_copy) TEST_P(TransportTCP, TCPv4_get_WAN_address) { // TCPv4TransportDescriptor - TCPv4TransportDescriptor tcpv4_transport; + eprosima::fastdds::rtps::TCPv4TransportDescriptor tcpv4_transport; tcpv4_transport.set_WAN_address("80.80.99.45"); ASSERT_EQ(tcpv4_transport.get_WAN_address(), "80.80.99.45"); } @@ -573,8 +573,8 @@ TEST_P(TransportTCP, TCPv4_get_WAN_address) TEST_P(TransportTCP, TCPv6_equal_operator) { // TCPv6TransportDescriptor - TCPv6TransportDescriptor tcpv6_transport_1; - TCPv6TransportDescriptor tcpv6_transport_2; + eprosima::fastdds::rtps::TCPv6TransportDescriptor tcpv6_transport_1; + eprosima::fastdds::rtps::TCPv6TransportDescriptor tcpv6_transport_2; // Compare equal in defult values ASSERT_EQ(tcpv6_transport_1, tcpv6_transport_2); @@ -599,17 +599,17 @@ TEST_P(TransportTCP, TCPv6_equal_operator) TEST_P(TransportTCP, TCPv6_copy) { // Change some varibles in order to check the non default creation - TCPv6TransportDescriptor tcpv6_transport; + eprosima::fastdds::rtps::TCPv6TransportDescriptor tcpv6_transport; tcpv6_transport.enable_tcp_nodelay = !tcpv6_transport.enable_tcp_nodelay; // change default value tcpv6_transport.max_logical_port = tcpv6_transport.max_logical_port + 10; // change default value tcpv6_transport.add_listener_port(123u * 98u); // Copy constructor - TCPv6TransportDescriptor tcpv6_transport_copy_constructor(tcpv6_transport); + eprosima::fastdds::rtps::TCPv6TransportDescriptor tcpv6_transport_copy_constructor(tcpv6_transport); EXPECT_EQ(tcpv6_transport, tcpv6_transport_copy_constructor); // Copy assignment - TCPv6TransportDescriptor tcpv6_transport_copy = tcpv6_transport; + eprosima::fastdds::rtps::TCPv6TransportDescriptor tcpv6_transport_copy = tcpv6_transport; EXPECT_EQ(tcpv6_transport_copy, tcpv6_transport); } @@ -681,7 +681,7 @@ TEST_P(TransportTCP, TCPv4_autofill_port) PubSubReader p2(TEST_TOPIC_NAME); // Add TCP Transport with listening port 0 - auto p1_transport = std::make_shared(); + auto p1_transport = std::make_shared(); p1_transport->add_listener_port(0); p1.disable_builtin_transport().add_user_transport_to_pparams(p1_transport); p1.init(); @@ -689,7 +689,7 @@ TEST_P(TransportTCP, TCPv4_autofill_port) // Add TCP Transport with listening port different from 0 uint16_t port = 12345; - auto p2_transport = std::make_shared(); + auto p2_transport = std::make_shared(); p2_transport->add_listener_port(port); p2.disable_builtin_transport().add_user_transport_to_pparams(p2_transport); p2.init(); @@ -711,7 +711,7 @@ TEST_P(TransportTCP, TCPv6_autofill_port) PubSubReader p2(TEST_TOPIC_NAME); // Add TCP Transport with listening port 0 - auto p1_transport = std::make_shared(); + auto p1_transport = std::make_shared(); p1_transport->add_listener_port(0); p1.disable_builtin_transport().add_user_transport_to_pparams(p1_transport); p1.init(); @@ -719,7 +719,7 @@ TEST_P(TransportTCP, TCPv6_autofill_port) // Add TCP Transport with listening port different from 0 uint16_t port = 12345; - auto p2_transport = std::make_shared(); + auto p2_transport = std::make_shared(); p2_transport->add_listener_port(port); p2.disable_builtin_transport().add_user_transport_to_pparams(p2_transport); p2.init(); @@ -851,14 +851,14 @@ TEST_P(TransportTCP, multiple_listening_ports) uint16_t server_port_1 = 10000; uint16_t server_port_2 = 10001; - std::shared_ptr server_transport; + std::shared_ptr server_transport; if (use_ipv6) { - server_transport = std::make_shared(); + server_transport = std::make_shared(); } else { - server_transport = std::make_shared(); + server_transport = std::make_shared(); } server_transport->add_listener_port(server_port_1); server_transport->add_listener_port(server_port_2); @@ -868,14 +868,14 @@ TEST_P(TransportTCP, multiple_listening_ports) // Create two clients each one connecting to a different port PubSubWriter* client_1 = new PubSubWriter(TEST_TOPIC_NAME); PubSubWriter* client_2 = new PubSubWriter(TEST_TOPIC_NAME); - std::shared_ptr client_transport_1; - std::shared_ptr client_transport_2; + std::shared_ptr client_transport_1; + std::shared_ptr client_transport_2; Locator_t initialPeerLocator_1; Locator_t initialPeerLocator_2; if (use_ipv6) { - client_transport_1 = std::make_shared(); - client_transport_2 = std::make_shared(); + client_transport_1 = std::make_shared(); + client_transport_2 = std::make_shared(); initialPeerLocator_1.kind = LOCATOR_KIND_TCPv6; initialPeerLocator_2.kind = LOCATOR_KIND_TCPv6; IPLocator::setIPv6(initialPeerLocator_1, "::1"); @@ -883,8 +883,8 @@ TEST_P(TransportTCP, multiple_listening_ports) } else { - client_transport_1 = std::make_shared(); - client_transport_2 = std::make_shared(); + client_transport_1 = std::make_shared(); + client_transport_2 = std::make_shared(); initialPeerLocator_1.kind = LOCATOR_KIND_TCPv4; initialPeerLocator_2.kind = LOCATOR_KIND_TCPv4; IPLocator::setIPv4(initialPeerLocator_1, 127, 0, 0, 1); @@ -989,17 +989,17 @@ TEST_P(TransportTCP, send_resource_cleanup) // Client auto initialize_client = [&](PubSubWriter* client) { - std::shared_ptr client_transport; + std::shared_ptr client_transport; Locator_t initialPeerLocator; if (use_ipv6) { - client_transport = std::make_shared(); + client_transport = std::make_shared(); initialPeerLocator.kind = LOCATOR_KIND_TCPv6; IPLocator::setIPv6(initialPeerLocator, "::1"); } else { - client_transport = std::make_shared(); + client_transport = std::make_shared(); initialPeerLocator.kind = LOCATOR_KIND_TCPv4; IPLocator::setIPv4(initialPeerLocator, 127, 0, 0, 1); } @@ -1012,7 +1012,7 @@ TEST_P(TransportTCP, send_resource_cleanup) }; auto initialize_udp_participant = [&](PubSubWriter* udp_participant) { - auto udp_participant_transport = std::make_shared(); + auto udp_participant_transport = std::make_shared(); udp_participant->disable_builtin_transport().add_user_transport_to_pparams(udp_participant_transport); udp_participant->init(); }; @@ -1132,7 +1132,7 @@ TEST_P(TransportTCP, send_resource_cleanup_initial_peer) initial_peer_list.push_back(initialPeerLocator); client->initial_peers(initial_peer_list); - auto low_level_transport = std::make_shared(); + auto low_level_transport = std::make_shared(); auto client_chaining_transport = std::make_shared(low_level_transport); client->disable_builtin_transport().add_user_transport_to_pparams(test_transport_).add_user_transport_to_pparams( client_chaining_transport).init(); @@ -1141,14 +1141,14 @@ TEST_P(TransportTCP, send_resource_cleanup_initial_peer) // Server auto initialize_server = [&](PubSubReader* server) { - std::shared_ptr server_transport; + std::shared_ptr server_transport; if (use_ipv6) { - server_transport = std::make_shared(); + server_transport = std::make_shared(); } else { - server_transport = std::make_shared(); + server_transport = std::make_shared(); } server_transport->add_listener_port(server_port); server->disable_builtin_transport().add_user_transport_to_pparams(server_transport); @@ -1156,7 +1156,7 @@ TEST_P(TransportTCP, send_resource_cleanup_initial_peer) }; auto initialize_udp_participant = [&](PubSubReader* udp_participant) { - auto udp_participant_transport = std::make_shared(); + auto udp_participant_transport = std::make_shared(); udp_participant->disable_builtin_transport().add_user_transport_to_pparams(udp_participant_transport); udp_participant->init(); }; @@ -1233,8 +1233,8 @@ TEST_P(TransportTCP, large_message_send_receive) PubSubReader reader(TEST_TOPIC_NAME); PubSubWriter writer(TEST_TOPIC_NAME); - std::shared_ptr writer_transport; - std::shared_ptr reader_transport; + std::shared_ptr writer_transport; + std::shared_ptr reader_transport; Locator_t initialPeerLocator; if (use_ipv6) { diff --git a/test/blackbox/common/BlackboxTestsTransportUDP.cpp b/test/blackbox/common/BlackboxTestsTransportUDP.cpp index fd9c8e66355..3ff9059f645 100644 --- a/test/blackbox/common/BlackboxTestsTransportUDP.cpp +++ b/test/blackbox/common/BlackboxTestsTransportUDP.cpp @@ -18,9 +18,9 @@ #include +#include #include #include -#include #include #include "BlackboxTests.hpp" @@ -388,7 +388,7 @@ TEST_P(TransportUDP, DefaultMulticastLocatorsParticipant) // Checking correct copying of participant metatraffic locators to the datawriters/datatreaders TEST_P(TransportUDP, MetatrafficMulticastLocatorsParticipant) { - Log::SetVerbosity(Log::Kind::Warning); + eprosima::fastdds::dds::Log::SetVerbosity(eprosima::fastdds::dds::Log::Kind::Warning); size_t writer_samples = 5; @@ -465,7 +465,7 @@ TEST_P(TransportUDP, DefaultMulticastLocatorsParticipantZeroPort) // Checking correct copying of participant metatraffic locators to the datawriters/datatreaders TEST_P(TransportUDP, MetatrafficMulticastLocatorsParticipantZeroPort) { - Log::SetVerbosity(Log::Kind::Warning); + eprosima::fastdds::dds::Log::SetVerbosity(eprosima::fastdds::dds::Log::Kind::Warning); size_t writer_samples = 5; diff --git a/test/blackbox/common/BlackboxTestsVolatile.cpp b/test/blackbox/common/BlackboxTestsVolatile.cpp index 6351d0baea1..a7bf3769b1f 100644 --- a/test/blackbox/common/BlackboxTestsVolatile.cpp +++ b/test/blackbox/common/BlackboxTestsVolatile.cpp @@ -83,7 +83,7 @@ TEST_P(Volatile, PubSubAsReliableVolatilePubRemoveWithoutSubs) PubSubWriter writer(TEST_TOPIC_NAME); writer.history_depth(10). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS).init(); + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS).init(); ASSERT_TRUE(writer.isInitialized()); @@ -109,9 +109,9 @@ TEST_P(Volatile, AsyncPubSubAsNonReliableVolatileHelloworld) ASSERT_TRUE(reader.isInitialized()); writer.history_depth(100). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE).init(); + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE).init(); ASSERT_TRUE(writer.isInitialized()); @@ -136,8 +136,8 @@ TEST_P(Volatile, AsyncVolatileKeepAllPubReliableSubNonReliable300Kb) PubSubReader reader(TEST_TOPIC_NAME); PubSubWriter writer(TEST_TOPIC_NAME); - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). init(); ASSERT_TRUE(reader.isInitialized()); @@ -147,12 +147,12 @@ TEST_P(Volatile, AsyncVolatileKeepAllPubReliableSubNonReliable300Kb) uint32_t bytesPerPeriod = 65536; uint32_t periodInMs = 50; - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). resource_limits_allocated_samples(9). resource_limits_max_samples(9). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). add_throughput_controller_descriptor_to_pparams( eprosima::fastdds::rtps::FlowControllerSchedulerPolicy::FIFO, bytesPerPeriod, periodInMs). init(); @@ -180,15 +180,15 @@ TEST_P(Volatile, VolatileKeepAllPubReliableSubNonReliableHelloWorld) PubSubReader reader(TEST_TOPIC_NAME); PubSubWriter writer(TEST_TOPIC_NAME); - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). init(); ASSERT_TRUE(reader.isInitialized()); - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). resource_limits_allocated_samples(9). resource_limits_max_samples(9). init(); @@ -216,18 +216,18 @@ TEST_P(Volatile, AsyncVolatileKeepAllPubReliableSubNonReliableHelloWorld) PubSubReader reader(TEST_TOPIC_NAME); PubSubWriter writer(TEST_TOPIC_NAME); - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS). + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS). init(); ASSERT_TRUE(reader.isInitialized()); - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). resource_limits_allocated_samples(9). resource_limits_max_samples(9). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). init(); ASSERT_TRUE(writer.isInitialized()); @@ -252,7 +252,7 @@ TEST_P(Volatile, ReqRepVolatileHelloworldRequesterCheckWriteParams) { ReqRepAsReliableHelloWorldRequester requester; - requester.durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS).init(); + requester.durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS).init(); ASSERT_TRUE(requester.isInitialized()); @@ -265,12 +265,12 @@ TEST_P(Volatile, AsyncVolatileSubBetweenPubs) PubSubReader reader(TEST_TOPIC_NAME); PubSubWriter writer(TEST_TOPIC_NAME); - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). resource_limits_allocated_samples(9). resource_limits_max_samples(9). - asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE). + asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE). heartbeat_period_seconds(3600). init(); @@ -282,9 +282,9 @@ TEST_P(Volatile, AsyncVolatileSubBetweenPubs) writer.send_sample(hello); - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). init(); ASSERT_TRUE(reader.isInitialized()); @@ -307,12 +307,12 @@ TEST_P(Volatile, VolatileSubBetweenPubs) PubSubReader reader(TEST_TOPIC_NAME); PubSubWriter writer(TEST_TOPIC_NAME); - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). resource_limits_allocated_samples(9). resource_limits_max_samples(9). - asynchronously(eprosima::fastrtps::SYNCHRONOUS_PUBLISH_MODE). + asynchronously(eprosima::fastdds::dds::SYNCHRONOUS_PUBLISH_MODE). heartbeat_period_seconds(3600). init(); @@ -324,9 +324,9 @@ TEST_P(Volatile, VolatileSubBetweenPubs) writer.send_sample(hello); - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). init(); ASSERT_TRUE(reader.isInitialized()); @@ -350,12 +350,12 @@ TEST_P(Volatile, AsyncVolatileSubBetweenTransientPubs) PubSubWriter writer(TEST_TOPIC_NAME); writer - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .resource_limits_allocated_samples(9) .resource_limits_max_samples(9) - .asynchronously(eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE) + .asynchronously(eprosima::fastdds::dds::ASYNCHRONOUS_PUBLISH_MODE) .heartbeat_period_seconds(3600) .init(); @@ -367,9 +367,9 @@ TEST_P(Volatile, AsyncVolatileSubBetweenTransientPubs) writer.send_sample(hello); - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). init(); ASSERT_TRUE(reader.isInitialized()); @@ -393,12 +393,12 @@ TEST_P(Volatile, VolatileSubBetweenTransientPubs) PubSubWriter writer(TEST_TOPIC_NAME); writer - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .resource_limits_allocated_samples(9) .resource_limits_max_samples(9) - .asynchronously(eprosima::fastrtps::SYNCHRONOUS_PUBLISH_MODE) + .asynchronously(eprosima::fastdds::dds::SYNCHRONOUS_PUBLISH_MODE) .heartbeat_period_seconds(3600) .init(); @@ -410,9 +410,9 @@ TEST_P(Volatile, VolatileSubBetweenTransientPubs) writer.send_sample(hello); - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). init(); ASSERT_TRUE(reader.isInitialized()); @@ -437,9 +437,9 @@ TEST_P(Volatile, VolatileLateJoinerSubGapLost) PubSubWriter writer(TEST_TOPIC_NAME); - reader1.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + reader1.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). //heartbeatResponseDelay(5,0). init(); @@ -459,14 +459,14 @@ TEST_P(Volatile, VolatileLateJoinerSubGapLost) }; testTransport->dropLogLength = 1; - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). resource_limits_allocated_samples(9). resource_limits_max_samples(9). disable_builtin_transport(). add_user_transport_to_pparams(testTransport). - asynchronously(eprosima::fastrtps::SYNCHRONOUS_PUBLISH_MODE). + asynchronously(eprosima::fastdds::dds::SYNCHRONOUS_PUBLISH_MODE). init(); ASSERT_TRUE(writer.isInitialized()); @@ -482,9 +482,9 @@ TEST_P(Volatile, VolatileLateJoinerSubGapLost) writer.send_sample(data.front()); data.pop_front(); - reader2.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + reader2.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). init(); ASSERT_TRUE(reader2.isInitialized()); @@ -509,9 +509,9 @@ TEST_P(Volatile, VolatileWithLostAcks) PubSubReader reader(TEST_TOPIC_NAME); PubSubWriter writer(TEST_TOPIC_NAME); - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). resource_limits_allocated_samples(10). resource_limits_max_samples(10). init(); @@ -531,9 +531,9 @@ TEST_P(Volatile, VolatileWithLostAcks) return false; }; - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS). - durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS). + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS). + durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS). resource_limits_allocated_samples(10). resource_limits_max_samples(10). disable_builtin_transport(). diff --git a/test/blackbox/common/DDSBlackboxTestsAckPositive.cpp b/test/blackbox/common/DDSBlackboxTestsAckPositive.cpp index 72b6473a7cb..d142ba1aa43 100644 --- a/test/blackbox/common/DDSBlackboxTestsAckPositive.cpp +++ b/test/blackbox/common/DDSBlackboxTestsAckPositive.cpp @@ -36,11 +36,12 @@ #include #include #include +#include #include -#include -#include #include +#include + #include "BlackboxTests.hpp" #include "../api/dds-pim/CustomPayloadPool.hpp" #include "../api/dds-pim/PubSubReader.hpp" @@ -68,15 +69,15 @@ TEST(AcknackQos, DDSEnableUpdatabilityOfPositiveAcksPeriodDDSLayer) // Configure datapublisher_qos writer.keep_duration({1, 0}); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); - writer.durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS); + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); + writer.durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS); writer.init(); ASSERT_TRUE(writer.isInitialized()); // Configure datasubscriber_qos reader.keep_duration({1, 0}); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); reader.init(); ASSERT_TRUE(reader.isInitialized()); @@ -160,20 +161,20 @@ TEST(AcknackQos, RecoverAfterLosingCommunicationWithDisablePositiveAck) auto testTransport = std::make_shared(); writer.keep_duration({2, 0}); - //writer.history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS); - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS); + //writer.history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS); + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS); //writer.history_depth(15); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); //writer.lifespan_period(lifespan_s); writer.disable_builtin_transport(); writer.add_user_transport_to_pparams(testTransport); writer.init(); reader.keep_duration({1, 0}); - //reader.history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS); - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS); + //reader.history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS); + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS); //reader.history_depth(15); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); //reader.lifespan_period(lifespan_s); reader.init(); @@ -226,20 +227,20 @@ TEST(AcknackQos, NotRecoverAfterLosingCommunicationWithDisablePositiveAck) auto testTransport = std::make_shared(); writer.keep_duration({1, 0}); - //writer.history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS); - writer.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS); + //writer.history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS); + writer.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS); //writer.history_depth(15); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); //writer.lifespan_period(lifespan_s); writer.disable_builtin_transport(); writer.add_user_transport_to_pparams(testTransport); writer.init(); reader.keep_duration({1, 0}); - //reader.history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS); - reader.history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS); + //reader.history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS); + reader.history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS); //reader.history_depth(15); - reader.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); + reader.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); //reader.lifespan_period(lifespan_s); reader.init(); @@ -285,12 +286,12 @@ TEST(AcknackQos, DisablePositiveAcksWithBestEffortReader) PubSubWriter writer(TEST_TOPIC_NAME); writer.keep_duration({2, 0}); - writer.reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS); - writer.durability_kind(eprosima::fastrtps::VOLATILE_DURABILITY_QOS); + writer.reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS); + writer.durability_kind(eprosima::fastdds::dds::VOLATILE_DURABILITY_QOS); writer.init(); reader.keep_duration({1, 0}); - reader.reliability(eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS); + reader.reliability(eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS); reader.init(); ASSERT_TRUE(reader.isInitialized()); diff --git a/test/blackbox/common/DDSBlackboxTestsBasic.cpp b/test/blackbox/common/DDSBlackboxTestsBasic.cpp index 518c6c3a9d9..b18b006005a 100644 --- a/test/blackbox/common/DDSBlackboxTestsBasic.cpp +++ b/test/blackbox/common/DDSBlackboxTestsBasic.cpp @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include #include "BlackboxTests.hpp" @@ -399,7 +399,7 @@ TEST(DDSBasic, PidRelatedSampleIdentity) PubSubReader reliable_reader(TEST_TOPIC_NAME); // Test transport will be used in order to filter inlineQoS - auto test_transport = std::make_shared(); + auto test_transport = std::make_shared(); bool exists_pid_related_sample_identity = false; bool exists_pid_custom_related_sample_identity = false; diff --git a/test/blackbox/common/DDSBlackboxTestsDataSharing.cpp b/test/blackbox/common/DDSBlackboxTestsDataSharing.cpp index 919954d8648..5563a5ccad4 100644 --- a/test/blackbox/common/DDSBlackboxTestsDataSharing.cpp +++ b/test/blackbox/common/DDSBlackboxTestsDataSharing.cpp @@ -17,9 +17,8 @@ #include #include - -#include -#include +#include +#include #include #include "BlackboxTests.hpp" @@ -79,7 +78,7 @@ TEST_P(DDSDataSharing, BasicCommunication) PubSubWriter writer(TEST_TOPIC_NAME); // Disable transports to ensure we are using datasharing - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->dropDataMessagesPercentage = 100; reader.history_depth(100) @@ -133,7 +132,7 @@ TEST(DDSDataSharing, TransientReader) PubSubWriter writer(TEST_TOPIC_NAME); // Disable transports to ensure we are using datasharing - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->dropDataMessagesPercentage = 100; constexpr int writer_history_depth = 2; @@ -198,7 +197,7 @@ TEST_P(DDSDataSharing, BestEffortDirtyPayloads) PubSubWriter writer(TEST_TOPIC_NAME); // Disable transports to ensure we are using datasharing - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->dropDataMessagesPercentage = 100; constexpr int writer_history_depth = 2; @@ -260,7 +259,7 @@ TEST_P(DDSDataSharing, ReliableDirtyPayloads) PubSubWriter writer(TEST_TOPIC_NAME); // Disable transports to ensure we are using datasharing - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->dropDataMessagesPercentage = 100; constexpr int writer_history_depth = 2; @@ -321,7 +320,7 @@ TEST(DDSDataSharing, DataSharingWriter_DifferentDomainReaders) PubSubReader non_datasharing_reader(TEST_TOPIC_NAME); PubSubReader auto_reader(TEST_TOPIC_NAME); - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->dropDataMessagesPercentage = 100; std::vector reader_ids; @@ -394,7 +393,7 @@ TEST(DDSDataSharing, DataSharingWriter_CommonDomainReaders) PubSubReader non_datasharing_reader(TEST_TOPIC_NAME); PubSubReader auto_reader(TEST_TOPIC_NAME); - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->dropDataMessagesPercentage = 100; std::vector reader_ids; @@ -469,7 +468,7 @@ TEST(DDSDataSharing, DataSharingReader_DifferentDomainWriters) PubSubWriter auto_writer(TEST_TOPIC_NAME); PubSubReader reader(TEST_TOPIC_NAME); - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->dropDataMessagesPercentage = 100; std::vector reader_ids; @@ -552,7 +551,7 @@ TEST(DDSDataSharing, DataSharingReader_CommonDomainWriters) PubSubWriter auto_writer(TEST_TOPIC_NAME); PubSubReader reader(TEST_TOPIC_NAME); - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->dropDataMessagesPercentage = 100; std::vector reader_ids; @@ -638,20 +637,20 @@ TEST_P(DDSDataSharing, DataSharingPoolError) PubSubReader reader(TEST_TOPIC_NAME); writer_datasharing.resource_limits_max_samples(100000) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .datasharing_on(".").init(); ASSERT_FALSE(writer_datasharing.isInitialized()); writer_auto.resource_limits_max_samples(100000) - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .datasharing_auto(".").init(); ASSERT_TRUE(writer_auto.isInitialized()); reader.datasharing_on(".") .history_depth(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(reader.isInitialized()); // Check that the shared files are created on the correct directory @@ -690,7 +689,7 @@ TEST_P(DDSDataSharing, DataSharingDefaultDirectory) PubSubWriter writer(TEST_TOPIC_NAME); // Disable transports to ensure we are using datasharing - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->dropDataMessagesPercentage = 100; reader.history_depth(100) @@ -734,7 +733,7 @@ TEST(DDSDataSharing, acknack_reception_when_change_removed_by_history) PubSubWriter writer(TEST_TOPIC_NAME); // Disable transports to ensure we are using datasharing - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->dropDataMessagesPercentage = 100; writer.history_depth(100) @@ -796,7 +795,7 @@ TEST(DDSDataSharing, acknack_reception_when_get_unread_count_and_change_removed_ PubSubWriter writer(TEST_TOPIC_NAME); // Disable transports to ensure we are using datasharing - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->dropDataMessagesPercentage = 100; writer.history_depth(100) @@ -870,7 +869,7 @@ TEST(DDSDataSharing, acknack_reception_when_get_unread_count) PubSubWriter writer(TEST_TOPIC_NAME); // Disable transports to ensure we are using datasharing - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->dropDataMessagesPercentage = 100; writer.history_depth(100) diff --git a/test/blackbox/common/DDSBlackboxTestsDataWriter.cpp b/test/blackbox/common/DDSBlackboxTestsDataWriter.cpp index 14444fe20fe..e82e02e50ef 100644 --- a/test/blackbox/common/DDSBlackboxTestsDataWriter.cpp +++ b/test/blackbox/common/DDSBlackboxTestsDataWriter.cpp @@ -225,8 +225,8 @@ TEST_P(DDSDataWriter, WithTimestampOperations) // Create and initialize reader PubSubReader reader(TEST_TOPIC_NAME); - reader.durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + reader.durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .history_depth(10) .init(); ASSERT_TRUE(reader.isInitialized()); @@ -234,8 +234,8 @@ TEST_P(DDSDataWriter, WithTimestampOperations) // Create and initialize writer PubSubWriter writer(TEST_TOPIC_NAME); - writer.durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + writer.durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .history_depth(10) .init(); ASSERT_TRUE(writer.isInitialized()); diff --git a/test/blackbox/common/DDSBlackboxTestsDiscovery.cpp b/test/blackbox/common/DDSBlackboxTestsDiscovery.cpp index 4ce5fabfdce..b6fd911b215 100644 --- a/test/blackbox/common/DDSBlackboxTestsDiscovery.cpp +++ b/test/blackbox/common/DDSBlackboxTestsDiscovery.cpp @@ -351,8 +351,8 @@ TEST(DDSDiscovery, DDSNetworkInterfaceChangesAtRunTime) PubSubReader datareader(TEST_TOPIC_NAME); // datareader is initialized with all the network interfaces - datareader.durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS).history_depth(100). - reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS).init(); + datareader.durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS).history_depth(100). + reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS).init(); ASSERT_TRUE(datareader.isInitialized()); // datawriter: launch without interfaces @@ -568,8 +568,10 @@ TEST(DDSDiscovery, ParticipantProxyPhysicalData) void on_participant_discovery( DomainParticipant* participant, - ParticipantDiscoveryInfo&& info) + ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) { + static_cast(should_be_ignored); std::unique_lock lck(*mtx_); if (info.status == eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::DISCOVERY_STATUS::DISCOVERED_PARTICIPANT) @@ -747,8 +749,10 @@ TEST(DDSDiscovery, DDSDiscoveryDoesNotDropUDPLocator) void on_participant_discovery( DomainParticipant* /*participant*/, - ParticipantDiscoveryInfo&& info) override + ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override { + static_cast(should_be_ignored); if (info.status == info.DISCOVERED_PARTICIPANT) { std::lock_guard guard(mtx); @@ -1807,7 +1811,8 @@ TEST(DDSDiscovery, DataracePDP) void on_participant_discovery( DomainParticipant* /*participant*/, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) override + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& /*should_be_ignored*/) override { if (info.status == eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { diff --git a/test/blackbox/common/DDSBlackboxTestsMonitorService.cpp b/test/blackbox/common/DDSBlackboxTestsMonitorService.cpp index 8a6ba057e39..fc5ea19321f 100644 --- a/test/blackbox/common/DDSBlackboxTestsMonitorService.cpp +++ b/test/blackbox/common/DDSBlackboxTestsMonitorService.cpp @@ -13,20 +13,19 @@ // limitations under the License. #include - -#include "BlackboxTests.hpp" -#include "../dds-pim/PubSubReader.hpp" -#include "PubSubWriter.hpp" - +#include #include #include -#include #include #include #include #include +#include "BlackboxTests.hpp" +#include "../dds-pim/PubSubReader.hpp" +#include "PubSubWriter.hpp" + using namespace eprosima::fastdds; using namespace eprosima::fastdds::dds; @@ -1737,7 +1736,7 @@ TEST(DDSMonitorServiceTest, monitor_service_simple_sample_lost_status) //! Procedure DomainParticipantQos dqos; - auto testTransport = std::make_shared(); + auto testTransport = std::make_shared(); testTransport->drop_data_messages_filter_ = [](eprosima::fastrtps::rtps::CDRMessage_t& msg)-> bool { uint32_t old_pos = msg.pos; @@ -2315,7 +2314,7 @@ TEST(DDSMonitorServiceTest, monitor_service_properly_handles_topic_instances) // Setup participant with monitor service enabled MonitorServiceParticipant MSP; - auto test_transport = std::make_shared(); + auto test_transport = std::make_shared(); std::atomic n_gap_messages{0}; diff --git a/test/blackbox/common/DDSBlackboxTestsOwnershipQos.cpp b/test/blackbox/common/DDSBlackboxTestsOwnershipQos.cpp index cbe1676f95c..168f4e891ef 100644 --- a/test/blackbox/common/DDSBlackboxTestsOwnershipQos.cpp +++ b/test/blackbox/common/DDSBlackboxTestsOwnershipQos.cpp @@ -15,8 +15,7 @@ #include #include - -#include +#include #include #include "BlackboxTests.hpp" @@ -1255,13 +1254,13 @@ void exclusive_kind_non_keyed_lost_liveliness( PubSubWriter writer3(TEST_TOPIC_NAME); std::atomic drop_messages1(false); - auto testTransport1 = std::make_shared(); + auto testTransport1 = std::make_shared(); testTransport1->messages_filter_ = [&drop_messages1](eprosima::fastrtps::rtps::CDRMessage_t&) { return drop_messages1.load(); }; std::atomic drop_messages3(false); - auto testTransport3 = std::make_shared(); + auto testTransport3 = std::make_shared(); testTransport3->messages_filter_ = [&drop_messages3](eprosima::fastrtps::rtps::CDRMessage_t&) { return drop_messages3.load(); @@ -1413,19 +1412,19 @@ void exclusive_kind_keyed_lost_liveliness( PubSubWriter writer4(TEST_TOPIC_NAME); std::atomic drop_messages2(false); - auto testTransport2 = std::make_shared(); + auto testTransport2 = std::make_shared(); testTransport2->messages_filter_ = [&drop_messages2](eprosima::fastrtps::rtps::CDRMessage_t&) { return drop_messages2.load(); }; std::atomic drop_messages3(false); - auto testTransport3 = std::make_shared(); + auto testTransport3 = std::make_shared(); testTransport3->messages_filter_ = [&drop_messages3](eprosima::fastrtps::rtps::CDRMessage_t&) { return drop_messages3.load(); }; std::atomic drop_messages4(false); - auto testTransport4 = std::make_shared(); + auto testTransport4 = std::make_shared(); testTransport4->messages_filter_ = [&drop_messages4](eprosima::fastrtps::rtps::CDRMessage_t&) { return drop_messages4.load(); diff --git a/test/blackbox/common/DDSBlackboxTestsPersistence.cpp b/test/blackbox/common/DDSBlackboxTestsPersistence.cpp index ba702e05d3b..d99e28ceb0a 100644 --- a/test/blackbox/common/DDSBlackboxTestsPersistence.cpp +++ b/test/blackbox/common/DDSBlackboxTestsPersistence.cpp @@ -15,9 +15,8 @@ #include #include - +#include #include -#include #include "BlackboxTests.hpp" #include "PubSubReader.hpp" @@ -110,9 +109,9 @@ class PersistenceLargeData : public testing::TestWithParam testTransport->receiveBufferSize = 32768; writer - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) .resource_limits_max_samples(100) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .make_persistent(db_file_name(), "77.72.69.74.65.72.5f.70.65.72.73.5f|67.75.69.64") .disable_builtin_transport() .add_user_transport_to_pparams(testTransport) @@ -139,10 +138,10 @@ class PersistenceLargeData : public testing::TestWithParam ASSERT_TRUE(writer.isInitialized()); reader - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .socket_buffer_size(1048576) .init(); @@ -176,9 +175,9 @@ TEST_P(PersistenceLargeData, PubSubAsReliablePubPersistentWithLifespanBefore) PubSubReader reader(TEST_TOPIC_NAME); writer - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) .resource_limits_max_samples(100) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .make_persistent(db_file_name(), "77.72.69.74.65.72.5f.70.65.72.73.5f|67.75.69.64") .lifespan_period({1, 0}) .init(); @@ -203,10 +202,10 @@ TEST_P(PersistenceLargeData, PubSubAsReliablePubPersistentWithLifespanBefore) std::this_thread::sleep_for(std::chrono::seconds(2)); reader - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); @@ -227,9 +226,9 @@ TEST_P(PersistenceLargeData, PubSubAsReliablePubPersistentWithLifespanSendingBef PubSubReader reader(TEST_TOPIC_NAME); writer - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) .resource_limits_max_samples(100) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .make_persistent(db_file_name(), "77.72.69.74.65.72.5f.70.65.72.73.5f|67.75.69.64") .lifespan_period({0, 100}) .init(); @@ -262,10 +261,10 @@ TEST_P(PersistenceLargeData, PubSubAsReliablePubPersistentWithLifespanSendingBef std::this_thread::sleep_for(std::chrono::seconds(2)); reader - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); @@ -286,9 +285,9 @@ TEST_P(PersistenceLargeData, PubSubAsReliablePubPersistentWithLifespanAfter) PubSubReader reader(TEST_TOPIC_NAME); writer - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) .resource_limits_max_samples(100) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .make_persistent(db_file_name(), "77.72.69.74.65.72.5f.70.65.72.73.5f|67.75.69.64") .lifespan_period({1, 0}) .init(); @@ -306,10 +305,10 @@ TEST_P(PersistenceLargeData, PubSubAsReliablePubPersistentWithLifespanAfter) writer.destroy(); reader - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) - .durability_kind(eprosima::fastrtps::TRANSIENT_LOCAL_DURABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) + .durability_kind(eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS) .init(); ASSERT_TRUE(reader.isInitialized()); @@ -396,8 +395,8 @@ TEST_P(PersistenceLargeData, PubSubAsReliablePubPersistentWithStaticDiscovery) WriterMulticastLocators.push_back(LocatorBuffer); writer - .history_kind(eprosima::fastrtps::KEEP_ALL_HISTORY_QOS) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .make_persistent(db_file_name(), "78.73.69.74.65.72.5f.70.65.72.73.5f|67.75.69.1") .static_discovery("file://PubSubWriterPersistence_static_disc.xml") .unicastLocatorList(WriterUnicastLocators) @@ -423,9 +422,9 @@ TEST_P(PersistenceLargeData, PubSubAsReliablePubPersistentWithStaticDiscovery) ReaderMulticastLocators.push_back(LocatorBuffer); reader - .history_kind(eprosima::fastrtps::KEEP_LAST_HISTORY_QOS) + .history_kind(eprosima::fastdds::dds::KEEP_LAST_HISTORY_QOS) .history_depth(10) - .reliability(eprosima::fastrtps::RELIABLE_RELIABILITY_QOS) + .reliability(eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS) .make_persistent(db_file_name(), "78.73.69.74.65.72.5f.70.65.72.73.5f|67.75.69.3") .static_discovery("file://PubSubReaderPersistence_static_disc.xml") .unicastLocatorList(ReaderUnicastLocators) diff --git a/test/blackbox/common/DDSBlackboxTestsSecurity.cpp b/test/blackbox/common/DDSBlackboxTestsSecurity.cpp index 32d325c0421..1d5ddafb098 100644 --- a/test/blackbox/common/DDSBlackboxTestsSecurity.cpp +++ b/test/blackbox/common/DDSBlackboxTestsSecurity.cpp @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include #include @@ -98,7 +98,7 @@ void test_big_message_corner_case( auto qos{ fastdds::PARTICIPANT_QOS_DEFAULT }; set_authentication_config(qos.properties().properties()); set_participant_crypto_config(qos.properties().properties()); - auto transport = std::make_shared(); + auto transport = std::make_shared(); transport->interfaceWhiteList.push_back("127.0.0.1"); qos.transport().use_builtin_transports = false; qos.transport().user_transports.push_back(transport); diff --git a/test/blackbox/common/DDSBlackboxTestsStatistics.cpp b/test/blackbox/common/DDSBlackboxTestsStatistics.cpp index a9dcd8ebcbb..1951e8bd568 100644 --- a/test/blackbox/common/DDSBlackboxTestsStatistics.cpp +++ b/test/blackbox/common/DDSBlackboxTestsStatistics.cpp @@ -154,7 +154,7 @@ void test_discovery_topic_physical_data( std::string xml_profile = "\ \ - \ + \ \ \ \ diff --git a/test/blackbox/common/DDSBlackboxTestsTransportSHMUDP.cpp b/test/blackbox/common/DDSBlackboxTestsTransportSHMUDP.cpp index 20cc3129778..5ed748d713d 100644 --- a/test/blackbox/common/DDSBlackboxTestsTransportSHMUDP.cpp +++ b/test/blackbox/common/DDSBlackboxTestsTransportSHMUDP.cpp @@ -12,9 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "BlackboxTests.hpp" -#include "mock/BlackboxMockConsumer.h" - #include #include #include @@ -22,15 +19,18 @@ #include #include - +#include #include #include -#include #include +#include + +// BlackboxTests.hpp should be included before API +#include "BlackboxTests.hpp" #include "../api/dds-pim/PubSubReader.hpp" #include "../api/dds-pim/PubSubWriter.hpp" -#include +#include "mock/BlackboxMockConsumer.h" using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; @@ -244,22 +244,22 @@ TEST(SHMUDP, SHM_metatraffic_wrong_config) /* Set up log */ BlackboxMockConsumer* helper_consumer = new BlackboxMockConsumer(); - Log::ClearConsumers(); // Remove default consumers - Log::RegisterConsumer(std::unique_ptr(helper_consumer)); // Registering a consumer transfer ownership + eprosima::fastdds::dds::Log::ClearConsumers(); // Remove default consumers + eprosima::fastdds::dds::Log::RegisterConsumer(std::unique_ptr(helper_consumer)); // Registering a consumer transfer ownership // Filter specific message - Log::SetVerbosity(Log::Kind::Warning); - Log::SetCategoryFilter(std::regex("RTPS_NETWORK")); - Log::SetErrorStringFilter(std::regex(".*__WRONG_VALUE__.*")); + eprosima::fastdds::dds::Log::SetVerbosity(eprosima::fastdds::dds::Log::Kind::Warning); + eprosima::fastdds::dds::Log::SetCategoryFilter(std::regex("RTPS_NETWORK")); + eprosima::fastdds::dds::Log::SetErrorStringFilter(std::regex(".*__WRONG_VALUE__.*")); // Perform test shm_metatraffic_test(TEST_TOPIC_NAME, "__WRONG_VALUE__", false, false); /* Check logs */ - Log::Flush(); + eprosima::fastdds::dds::Log::Flush(); EXPECT_EQ(helper_consumer->ConsumedEntries().size(), 1u); /* Clean-up */ - Log::Reset(); // This calls to ClearConsumers, which deletes the registered consumer + eprosima::fastdds::dds::Log::Reset(); // This calls to ClearConsumers, which deletes the registered consumer } #ifdef INSTANTIATE_TEST_SUITE_P diff --git a/test/blackbox/common/RTPSAsSocketReader.hpp b/test/blackbox/common/RTPSAsSocketReader.hpp index dd79222108c..7597b48033a 100644 --- a/test/blackbox/common/RTPSAsSocketReader.hpp +++ b/test/blackbox/common/RTPSAsSocketReader.hpp @@ -20,29 +20,9 @@ #ifndef _TEST_BLACKBOX_RTPSASSOCKETREADER_HPP_ #define _TEST_BLACKBOX_RTPSASSOCKETREADER_HPP_ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include #include -#include -#include - +#include +#include #if defined(_WIN32) #include @@ -51,6 +31,24 @@ #define GET_PID getpid #endif // if defined(_WIN32) +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + using eprosima::fastrtps::rtps::IPLocator; template @@ -299,7 +297,7 @@ class RTPSAsSocketReader IPLocator::setIPv4(loc, ip_); loc.port = static_cast(port_); wattr.add_multicast_locator(loc); - wattr.m_qos.m_reliability.kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + wattr.m_qos.m_reliability.kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; wattr.guid().guidPrefix.value[0] = guid.guidPrefix.value[0]; wattr.guid().guidPrefix.value[1] = guid.guidPrefix.value[1]; wattr.guid().guidPrefix.value[2] = guid.guidPrefix.value[2]; diff --git a/test/blackbox/common/RTPSAsSocketWriter.hpp b/test/blackbox/common/RTPSAsSocketWriter.hpp index 64a5ce63f84..e0cdaf1efa4 100644 --- a/test/blackbox/common/RTPSAsSocketWriter.hpp +++ b/test/blackbox/common/RTPSAsSocketWriter.hpp @@ -20,25 +20,24 @@ #ifndef _TEST_BLACKBOX_RTPSASSOCKETWRITER_HPP_ #define _TEST_BLACKBOX_RTPSASSOCKETWRITER_HPP_ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include #include #include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include using eprosima::fastrtps::rtps::IPLocator; @@ -237,7 +236,7 @@ class RTPSAsSocketWriter : public eprosima::fastrtps::rtps::WriterListener if (writer_attr_.endpoint.reliabilityKind == eprosima::fastrtps::rtps::RELIABLE) { - rattr.m_qos.m_reliability.kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + rattr.m_qos.m_reliability.kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; } // Check disable_positive_acks_ attribute diff --git a/test/blackbox/common/RTPSBlackboxTests.cpp b/test/blackbox/common/RTPSBlackboxTests.cpp index b8f5ce212a1..fe00f941db0 100644 --- a/test/blackbox/common/RTPSBlackboxTests.cpp +++ b/test/blackbox/common/RTPSBlackboxTests.cpp @@ -12,24 +12,22 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "BlackboxTests.hpp" +#include +#include +#include +#include +#include +#include +#include +#include + +#include "BlackboxTests.hpp" #include "RTPSAsSocketReader.hpp" #include "RTPSAsSocketWriter.hpp" #include "RTPSWithRegistrationReader.hpp" #include "RTPSWithRegistrationWriter.hpp" -#include - -#include -#include -#include - -#include -#include -#include -#include - using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; diff --git a/test/blackbox/common/RTPSBlackboxTestsBasic.cpp b/test/blackbox/common/RTPSBlackboxTestsBasic.cpp index 35e8a45b554..9698cb088fb 100644 --- a/test/blackbox/common/RTPSBlackboxTestsBasic.cpp +++ b/test/blackbox/common/RTPSBlackboxTestsBasic.cpp @@ -12,29 +12,29 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "BlackboxTests.hpp" #include #include #include #include -#include - +#include #include #include #include #include #include #include -#include #include +#include +#include + +#include "BlackboxTests.hpp" #include "RTPSAsSocketReader.hpp" #include "RTPSAsSocketWriter.hpp" #include "RTPSWithRegistrationReader.hpp" #include "RTPSWithRegistrationWriter.hpp" -#include using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; @@ -820,7 +820,7 @@ TEST(RTPS, MultithreadedWriterCreation) rtps_participant, writer_attr, history, nullptr); /* Register writer in participant */ - eprosima::fastrtps::WriterQos writer_qos; + eprosima::fastdds::dds::WriterQos writer_qos; ASSERT_EQ(rtps_participant->registerWriter(writer, topic_attr, writer_qos), true); { @@ -1020,12 +1020,12 @@ TEST(RTPS, reliable_has_been_fully_delivered) */ TEST(RTPS, participant_ignore_local_endpoints) { - class CustomLogConsumer : public LogConsumer + class CustomLogConsumer : public eprosima::fastdds::dds::LogConsumer { public: void Consume( - const Log::Entry&) override + const eprosima::fastdds::dds::Log::Entry&) override { logs_consumed_++; cv_.notify_all(); @@ -1074,11 +1074,11 @@ TEST(RTPS, participant_ignore_local_endpoints) std::cout << "---------------------------------------" << std::endl; /* Set up */ - Log::Reset(); - Log::SetVerbosity(Log::Error); + eprosima::fastdds::dds::Log::Reset(); + eprosima::fastdds::dds::Log::SetVerbosity(eprosima::fastdds::dds::Log::Error); CustomLogConsumer* log_consumer = new CustomLogConsumer(); std::unique_ptr log_consumer_unique_ptr(log_consumer); - Log::RegisterConsumer(std::move(log_consumer_unique_ptr)); + eprosima::fastdds::dds::Log::RegisterConsumer(std::move(log_consumer_unique_ptr)); // Create the RTPSParticipant with the appropriate value for the property eprosima::fastrtps::rtps::RTPSParticipantAttributes patt; @@ -1121,7 +1121,7 @@ TEST(RTPS, participant_ignore_local_endpoints) /* Tear-down */ eprosima::fastrtps::rtps::RTPSDomain::removeRTPSParticipant(participant); - Log::Reset(); + eprosima::fastdds::dds::Log::Reset(); } } diff --git a/test/blackbox/common/RTPSWithRegistrationReader.hpp b/test/blackbox/common/RTPSWithRegistrationReader.hpp index d48300ca830..eb16aeaa771 100644 --- a/test/blackbox/common/RTPSWithRegistrationReader.hpp +++ b/test/blackbox/common/RTPSWithRegistrationReader.hpp @@ -20,27 +20,26 @@ #ifndef _TEST_BLACKBOX_RTPSWITHREGISTRATIONREADER_HPP_ #define _TEST_BLACKBOX_RTPSWITHREGISTRATIONREADER_HPP_ -#include -#include -#include -#include -#include -#include -#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include #include -#include -#include -#include #include - -#include -#include - -#include -#include -#include #include using eprosima::fastrtps::rtps::IPLocator; @@ -441,11 +440,11 @@ class RTPSWithRegistrationReader if (kind == eprosima::fastrtps::rtps::ReliabilityKind_t::RELIABLE) { - reader_qos_.m_reliability.kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + reader_qos_.m_reliability.kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; } else { - reader_qos_.m_reliability.kind = eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS; + reader_qos_.m_reliability.kind = eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS; } return *this; @@ -632,7 +631,7 @@ class RTPSWithRegistrationReader eprosima::fastrtps::rtps::RTPSReader* reader_; eprosima::fastrtps::rtps::ReaderAttributes reader_attr_; eprosima::fastrtps::TopicAttributes topic_attr_; - eprosima::fastrtps::ReaderQos reader_qos_; + eprosima::fastdds::dds::ReaderQos reader_qos_; eprosima::fastrtps::rtps::ReaderHistory* history_; eprosima::fastrtps::rtps::HistoryAttributes hattr_; std::atomic initialized_; diff --git a/test/blackbox/common/RTPSWithRegistrationWriter.hpp b/test/blackbox/common/RTPSWithRegistrationWriter.hpp index 0b35f07cd9e..b2f8ea2d6c5 100644 --- a/test/blackbox/common/RTPSWithRegistrationWriter.hpp +++ b/test/blackbox/common/RTPSWithRegistrationWriter.hpp @@ -389,11 +389,11 @@ class RTPSWithRegistrationWriter if (kind == eprosima::fastrtps::rtps::ReliabilityKind_t::BEST_EFFORT) { - writer_qos_.m_reliability.kind = eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS; + writer_qos_.m_reliability.kind = eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS; } else { - writer_qos_.m_reliability.kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + writer_qos_.m_reliability.kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; } return *this; @@ -597,7 +597,7 @@ class RTPSWithRegistrationWriter bool destroy_participant_{false}; eprosima::fastrtps::rtps::RTPSWriter* writer_; eprosima::fastrtps::rtps::WriterAttributes writer_attr_; - eprosima::fastrtps::WriterQos writer_qos_; + eprosima::fastdds::dds::WriterQos writer_qos_; eprosima::fastrtps::TopicAttributes topic_attr_; eprosima::fastrtps::rtps::WriterHistory* history_; eprosima::fastrtps::rtps::HistoryAttributes hattr_; diff --git a/test/blackbox/discovery_participant_flags_profile.xml b/test/blackbox/discovery_participant_flags_profile.xml index ff4d216972c..a56c9a4546f 100644 --- a/test/blackbox/discovery_participant_flags_profile.xml +++ b/test/blackbox/discovery_participant_flags_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/blackbox/partitions_profile.xml b/test/blackbox/partitions_profile.xml index aa418cea056..ed18a4925f5 100644 --- a/test/blackbox/partitions_profile.xml +++ b/test/blackbox/partitions_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/CMakeLists.txt b/test/dds/communication/CMakeLists.txt index d2696757422..16b58283900 100644 --- a/test/dds/communication/CMakeLists.txt +++ b/test/dds/communication/CMakeLists.txt @@ -34,7 +34,7 @@ target_compile_definitions(DDSSimpleCommunicationDynamicPublisher PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSSimpleCommunicationDynamicPublisher fastrtps fastcdr foonathan_memory ${CMAKE_DL_LIBS}) +target_link_libraries(DDSSimpleCommunicationDynamicPublisher fastdds fastcdr foonathan_memory ${CMAKE_DL_LIBS}) set(DDS_SUBSCRIBER_DYNAMIC_SOURCE SubscriberDynamic.cpp @@ -44,7 +44,7 @@ target_compile_definitions(DDSSimpleCommunicationDynamicSubscriber PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) -target_link_libraries(DDSSimpleCommunicationDynamicSubscriber fastrtps fastcdr foonathan_memory ${CMAKE_DL_LIBS}) +target_link_libraries(DDSSimpleCommunicationDynamicSubscriber fastdds fastcdr foonathan_memory ${CMAKE_DL_LIBS}) # Standard tests set(COMMON_SOURCE @@ -67,7 +67,7 @@ target_compile_definitions(DDSCommunicationPublisher PRIVATE $<$:__INTERNALDEBUG> # Internal debug activated. ) target_include_directories(DDSCommunicationPublisher PRIVATE ${PROJECT_SOURCE_DIR}/test/blackbox) -target_link_libraries(DDSCommunicationPublisher fastrtps fastcdr foonathan_memory ${CMAKE_DL_LIBS}) +target_link_libraries(DDSCommunicationPublisher fastdds fastcdr foonathan_memory ${CMAKE_DL_LIBS}) set(DDS_SUBSCRIBER_SOURCE ${COMMON_SOURCE} SubscriberModule.cpp @@ -79,7 +79,7 @@ target_compile_definitions(DDSCommunicationSubscriber PRIVATE $<$:__INTERNALDEBUG> # Internal debug activated. ) target_include_directories(DDSCommunicationSubscriber PRIVATE ${PROJECT_SOURCE_DIR}/test/blackbox) -target_link_libraries(DDSCommunicationSubscriber fastrtps fastcdr foonathan_memory ${CMAKE_DL_LIBS}) +target_link_libraries(DDSCommunicationSubscriber fastdds fastcdr foonathan_memory ${CMAKE_DL_LIBS}) set(DDS_PUBSUB_SOURCE ${COMMON_SOURCE} PublisherModule.cpp @@ -92,7 +92,7 @@ target_compile_definitions(DDSCommunicationPubSub PRIVATE $<$:__INTERNALDEBUG> # Internal debug activated. ) target_include_directories(DDSCommunicationPubSub PRIVATE ${PROJECT_SOURCE_DIR}/test/blackbox) -target_link_libraries(DDSCommunicationPubSub fastrtps fastcdr foonathan_memory ${CMAKE_DL_LIBS}) +target_link_libraries(DDSCommunicationPubSub fastdds fastcdr foonathan_memory ${CMAKE_DL_LIBS}) ############################################################################### # Necessary files diff --git a/test/dds/communication/PubSubMain.cpp b/test/dds/communication/PubSubMain.cpp index 46553c9f64b..e81c2a379c2 100644 --- a/test/dds/communication/PubSubMain.cpp +++ b/test/dds/communication/PubSubMain.cpp @@ -15,13 +15,12 @@ /** * @file PubSubMain.cpp */ -#include "SubscriberModule.hpp" -#include "PublisherModule.hpp" +#include #include -#include -#include +#include "PublisherModule.hpp" +#include "SubscriberModule.hpp" using namespace eprosima::fastdds::dds; diff --git a/test/dds/communication/PublisherDynamic.cpp b/test/dds/communication/PublisherDynamic.cpp index 753325adba2..d8aecd32b8b 100644 --- a/test/dds/communication/PublisherDynamic.cpp +++ b/test/dds/communication/PublisherDynamic.cpp @@ -24,7 +24,6 @@ #include #include - #include #include #include @@ -33,8 +32,6 @@ #include #include #include -#include -#include #include #include @@ -66,7 +63,8 @@ class ParListener : public DomainParticipantListener */ void on_participant_discovery( DomainParticipant* /*participant*/, - rtps::ParticipantDiscoveryInfo&& info) override + rtps::ParticipantDiscoveryInfo&& info, + bool& /*should_be_ignored*/) override { if (info.status == rtps::ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { diff --git a/test/dds/communication/PublisherMain.cpp b/test/dds/communication/PublisherMain.cpp index 0d72b20ae5b..bc9a2600d6e 100644 --- a/test/dds/communication/PublisherMain.cpp +++ b/test/dds/communication/PublisherMain.cpp @@ -15,10 +15,10 @@ /** * @file PublisherMain.cpp */ -#include "PublisherModule.hpp" #include -#include + +#include "PublisherModule.hpp" using namespace eprosima::fastdds::dds; diff --git a/test/dds/communication/PublisherModule.cpp b/test/dds/communication/PublisherModule.cpp index d798a5c8434..db4f39fab13 100644 --- a/test/dds/communication/PublisherModule.cpp +++ b/test/dds/communication/PublisherModule.cpp @@ -214,7 +214,8 @@ void PublisherModule::on_publication_matched( void PublisherModule::on_participant_discovery( DomainParticipant* /*participant*/, - ParticipantDiscoveryInfo&& info) + ParticipantDiscoveryInfo&& info, + bool& /*should_be_ignored*/) { if (info.status == ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { diff --git a/test/dds/communication/PublisherModule.hpp b/test/dds/communication/PublisherModule.hpp index fb144821a0a..85b7c1ad155 100644 --- a/test/dds/communication/PublisherModule.hpp +++ b/test/dds/communication/PublisherModule.hpp @@ -63,7 +63,8 @@ class PublisherModule */ void on_participant_discovery( DomainParticipant* /*participant*/, - fastrtps::rtps::ParticipantDiscoveryInfo&& info) override; + fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override; #if HAVE_SECURITY void onParticipantAuthentication( diff --git a/test/dds/communication/SubscriberDynamic.cpp b/test/dds/communication/SubscriberDynamic.cpp index dae0f6cd866..5f2cb602008 100644 --- a/test/dds/communication/SubscriberDynamic.cpp +++ b/test/dds/communication/SubscriberDynamic.cpp @@ -23,18 +23,15 @@ #include #include - -#include #include +#include #include -#include -#include #include -#include #include -#include -#include -#include +#include +#include +#include +#include #include #include @@ -58,7 +55,8 @@ class ParListener : public DomainParticipantListener */ void on_participant_discovery( DomainParticipant* /*participant*/, - rtps::ParticipantDiscoveryInfo&& info) override + rtps::ParticipantDiscoveryInfo&& info, + bool& /*should_be_ignored*/) override { if (info.status == rtps::ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { diff --git a/test/dds/communication/SubscriberMain.cpp b/test/dds/communication/SubscriberMain.cpp index cb96f16ffb8..7e07441f7fd 100644 --- a/test/dds/communication/SubscriberMain.cpp +++ b/test/dds/communication/SubscriberMain.cpp @@ -15,10 +15,10 @@ /** * @file SubscriberMain.cpp */ -#include "SubscriberModule.hpp" #include -#include + +#include "SubscriberModule.hpp" using namespace eprosima::fastdds::dds; diff --git a/test/dds/communication/SubscriberModule.cpp b/test/dds/communication/SubscriberModule.cpp index 77992bbd823..c7133b90c42 100644 --- a/test/dds/communication/SubscriberModule.cpp +++ b/test/dds/communication/SubscriberModule.cpp @@ -197,7 +197,8 @@ bool SubscriberModule::run_for( void SubscriberModule::on_participant_discovery( DomainParticipant* /*participant*/, - ParticipantDiscoveryInfo&& info) + ParticipantDiscoveryInfo&& info, + bool& /*should_be_ignored*/) { if (info.status == ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { diff --git a/test/dds/communication/SubscriberModule.hpp b/test/dds/communication/SubscriberModule.hpp index 901e3137dc7..62071c141c6 100644 --- a/test/dds/communication/SubscriberModule.hpp +++ b/test/dds/communication/SubscriberModule.hpp @@ -61,7 +61,8 @@ class SubscriberModule void on_participant_discovery( DomainParticipant* /*participant*/, - fastrtps::rtps::ParticipantDiscoveryInfo&& info) override; + fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override; #if HAVE_SECURITY void onParticipantAuthentication( diff --git a/test/dds/communication/TCP_client_profile.xml b/test/dds/communication/TCP_client_profile.xml index 9e9e019fcde..6fa0ac87ba9 100644 --- a/test/dds/communication/TCP_client_profile.xml +++ b/test/dds/communication/TCP_client_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/TCP_server_profile.xml b/test/dds/communication/TCP_server_profile.xml index 93ab3f6d767..737169cc623 100644 --- a/test/dds/communication/TCP_server_profile.xml +++ b/test/dds/communication/TCP_server_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/example_type_profile.xml b/test/dds/communication/example_type_profile.xml index d11369f1e39..331b0c63290 100644 --- a/test/dds/communication/example_type_profile.xml +++ b/test/dds/communication/example_type_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/liveliness_assertion.120_profile.xml b/test/dds/communication/liveliness_assertion.120_profile.xml index e6bcbc6e43c..1a88211c572 100644 --- a/test/dds/communication/liveliness_assertion.120_profile.xml +++ b/test/dds/communication/liveliness_assertion.120_profile.xml @@ -1,5 +1,5 @@ - + FULL diff --git a/test/dds/communication/liveliness_assertion.360_profile.xml b/test/dds/communication/liveliness_assertion.360_profile.xml index 78e3069d5ce..da540f7481d 100644 --- a/test/dds/communication/liveliness_assertion.360_profile.xml +++ b/test/dds/communication/liveliness_assertion.360_profile.xml @@ -1,5 +1,5 @@ - + FULL diff --git a/test/dds/communication/liveliness_assertion_profile.xml b/test/dds/communication/liveliness_assertion_profile.xml index 075a96b8a28..5c7799ab740 100644 --- a/test/dds/communication/liveliness_assertion_profile.xml +++ b/test/dds/communication/liveliness_assertion_profile.xml @@ -1,5 +1,5 @@ - + FULL diff --git a/test/dds/communication/security/CMakeLists.txt b/test/dds/communication/security/CMakeLists.txt index 699de565668..20bbba8fa83 100644 --- a/test/dds/communication/security/CMakeLists.txt +++ b/test/dds/communication/security/CMakeLists.txt @@ -44,7 +44,7 @@ target_compile_definitions(CommunicationPublisher PRIVATE $<$:__INTERNALDEBUG> # Internal debug activated. ) target_include_directories(CommunicationPublisher PRIVATE ${PROJECT_SOURCE_DIR}/test/blackbox) -target_link_libraries(CommunicationPublisher fastrtps fastcdr foonathan_memory ${CMAKE_DL_LIBS}) +target_link_libraries(CommunicationPublisher fastdds fastcdr foonathan_memory ${CMAKE_DL_LIBS}) set(DDS_SUBSCRIBER_SOURCE ${COMMON_SOURCE} SubscriberModule.cpp @@ -56,7 +56,7 @@ target_compile_definitions(CommunicationSubscriber PRIVATE $<$:__INTERNALDEBUG> # Internal debug activated. ) target_include_directories(CommunicationSubscriber PRIVATE ${PROJECT_SOURCE_DIR}/test/blackbox) -target_link_libraries(CommunicationSubscriber fastrtps fastcdr foonathan_memory ${CMAKE_DL_LIBS}) +target_link_libraries(CommunicationSubscriber fastdds fastcdr foonathan_memory ${CMAKE_DL_LIBS}) ############################################################################### # Necessary files diff --git a/test/dds/communication/security/PublisherMain.cpp b/test/dds/communication/security/PublisherMain.cpp index 0d72b20ae5b..8db6dee6f19 100644 --- a/test/dds/communication/security/PublisherMain.cpp +++ b/test/dds/communication/security/PublisherMain.cpp @@ -18,7 +18,6 @@ #include "PublisherModule.hpp" #include -#include using namespace eprosima::fastdds::dds; diff --git a/test/dds/communication/security/PublisherModule.cpp b/test/dds/communication/security/PublisherModule.cpp index 3d9477ede9b..b9452a6db6f 100644 --- a/test/dds/communication/security/PublisherModule.cpp +++ b/test/dds/communication/security/PublisherModule.cpp @@ -214,7 +214,8 @@ void PublisherModule::on_publication_matched( void PublisherModule::on_participant_discovery( DomainParticipant* /*participant*/, - ParticipantDiscoveryInfo&& info) + ParticipantDiscoveryInfo&& info, + bool& /*should_be_ignored*/) { if (info.status == ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { diff --git a/test/dds/communication/security/PublisherModule.hpp b/test/dds/communication/security/PublisherModule.hpp index fb144821a0a..c007af7fb9e 100644 --- a/test/dds/communication/security/PublisherModule.hpp +++ b/test/dds/communication/security/PublisherModule.hpp @@ -58,12 +58,14 @@ class PublisherModule /** * This method is called when a new Participant is discovered, or a previously discovered participant * changes its QOS or is removed. - * @param p Pointer to the Participant + * @param participant Pointer to the Participant * @param info DiscoveryInfo. + * @param should_be_ignored Flag to indicate the library to automatically ignore the discovered Participant. */ void on_participant_discovery( - DomainParticipant* /*participant*/, - fastrtps::rtps::ParticipantDiscoveryInfo&& info) override; + DomainParticipant* participant, + fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override; #if HAVE_SECURITY void onParticipantAuthentication( diff --git a/test/dds/communication/security/SubscriberMain.cpp b/test/dds/communication/security/SubscriberMain.cpp index f1f0d513ee6..f917d594c92 100644 --- a/test/dds/communication/security/SubscriberMain.cpp +++ b/test/dds/communication/security/SubscriberMain.cpp @@ -18,7 +18,6 @@ #include "SubscriberModule.hpp" #include -#include using namespace eprosima::fastdds::dds; diff --git a/test/dds/communication/security/SubscriberModule.cpp b/test/dds/communication/security/SubscriberModule.cpp index 4160e127297..cae887cfc65 100644 --- a/test/dds/communication/security/SubscriberModule.cpp +++ b/test/dds/communication/security/SubscriberModule.cpp @@ -189,7 +189,8 @@ bool SubscriberModule::run_for( void SubscriberModule::on_participant_discovery( DomainParticipant* /*participant*/, - ParticipantDiscoveryInfo&& info) + ParticipantDiscoveryInfo&& info, + bool& /*should_be_ignored*/) { if (info.status == ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { diff --git a/test/dds/communication/security/SubscriberModule.hpp b/test/dds/communication/security/SubscriberModule.hpp index 980c6c5acc6..39d8dc6472c 100644 --- a/test/dds/communication/security/SubscriberModule.hpp +++ b/test/dds/communication/security/SubscriberModule.hpp @@ -59,7 +59,8 @@ class SubscriberModule void on_participant_discovery( DomainParticipant* /*participant*/, - fastrtps::rtps::ParticipantDiscoveryInfo&& info) override; + fastrtps::rtps::ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override; #if HAVE_SECURITY void onParticipantAuthentication( diff --git a/test/dds/communication/security/secure_ds_simple_secure_msg_crypto_ds_1_sub_profile.xml b/test/dds/communication/security/secure_ds_simple_secure_msg_crypto_ds_1_sub_profile.xml index f811d5d8391..e67e32c0fcc 100644 --- a/test/dds/communication/security/secure_ds_simple_secure_msg_crypto_ds_1_sub_profile.xml +++ b/test/dds/communication/security/secure_ds_simple_secure_msg_crypto_ds_1_sub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_ds_simple_secure_msg_crypto_pub_profile.xml b/test/dds/communication/security/secure_ds_simple_secure_msg_crypto_pub_profile.xml index 854cf1a6e59..b5f7ec9d1d4 100644 --- a/test/dds/communication/security/secure_ds_simple_secure_msg_crypto_pub_profile.xml +++ b/test/dds/communication/security/secure_ds_simple_secure_msg_crypto_pub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_ds_simple_secure_msg_crypto_sub_profile.xml b/test/dds/communication/security/secure_ds_simple_secure_msg_crypto_sub_profile.xml index 115ae3ddaa5..6c5d3a197d5 100644 --- a/test/dds/communication/security/secure_ds_simple_secure_msg_crypto_sub_profile.xml +++ b/test/dds/communication/security/secure_ds_simple_secure_msg_crypto_sub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_ds_simple_secure_no_discovery_no_rtps_protection_ds_1_sub_profile.xml b/test/dds/communication/security/secure_ds_simple_secure_no_discovery_no_rtps_protection_ds_1_sub_profile.xml index 4c435d1c602..e037e744c51 100644 --- a/test/dds/communication/security/secure_ds_simple_secure_no_discovery_no_rtps_protection_ds_1_sub_profile.xml +++ b/test/dds/communication/security/secure_ds_simple_secure_no_discovery_no_rtps_protection_ds_1_sub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_ds_simple_secure_no_discovery_no_rtps_protection_pub_profile.xml b/test/dds/communication/security/secure_ds_simple_secure_no_discovery_no_rtps_protection_pub_profile.xml index 3eed28cb516..d5b84f3c0d5 100644 --- a/test/dds/communication/security/secure_ds_simple_secure_no_discovery_no_rtps_protection_pub_profile.xml +++ b/test/dds/communication/security/secure_ds_simple_secure_no_discovery_no_rtps_protection_pub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_ds_simple_secure_no_discovery_no_rtps_protection_sub_profile.xml b/test/dds/communication/security/secure_ds_simple_secure_no_discovery_no_rtps_protection_sub_profile.xml index 66ca99f44f4..086b0a06969 100644 --- a/test/dds/communication/security/secure_ds_simple_secure_no_discovery_no_rtps_protection_sub_profile.xml +++ b/test/dds/communication/security/secure_ds_simple_secure_no_discovery_no_rtps_protection_sub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_ds_simple_secure_no_discovery_protection_ds_1_sub_profile.xml b/test/dds/communication/security/secure_ds_simple_secure_no_discovery_protection_ds_1_sub_profile.xml index 76a64d593e6..10223bc36fb 100644 --- a/test/dds/communication/security/secure_ds_simple_secure_no_discovery_protection_ds_1_sub_profile.xml +++ b/test/dds/communication/security/secure_ds_simple_secure_no_discovery_protection_ds_1_sub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_ds_simple_secure_no_discovery_protection_pub_profile.xml b/test/dds/communication/security/secure_ds_simple_secure_no_discovery_protection_pub_profile.xml index 439436120bc..4af859998c4 100644 --- a/test/dds/communication/security/secure_ds_simple_secure_no_discovery_protection_pub_profile.xml +++ b/test/dds/communication/security/secure_ds_simple_secure_no_discovery_protection_pub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_ds_simple_secure_no_discovery_protection_sub_profile.xml b/test/dds/communication/security/secure_ds_simple_secure_no_discovery_protection_sub_profile.xml index 9a07929b8da..a40f5f4d40e 100644 --- a/test/dds/communication/security/secure_ds_simple_secure_no_discovery_protection_sub_profile.xml +++ b/test/dds/communication/security/secure_ds_simple_secure_no_discovery_protection_sub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_ds_simple_secure_no_rtps_protection_ds_1_sub_profile.xml b/test/dds/communication/security/secure_ds_simple_secure_no_rtps_protection_ds_1_sub_profile.xml index fb765a64624..1d4d62f4ca2 100644 --- a/test/dds/communication/security/secure_ds_simple_secure_no_rtps_protection_ds_1_sub_profile.xml +++ b/test/dds/communication/security/secure_ds_simple_secure_no_rtps_protection_ds_1_sub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_ds_simple_secure_no_rtps_protection_pub_profile.xml b/test/dds/communication/security/secure_ds_simple_secure_no_rtps_protection_pub_profile.xml index c9355612c18..21a901955ef 100644 --- a/test/dds/communication/security/secure_ds_simple_secure_no_rtps_protection_pub_profile.xml +++ b/test/dds/communication/security/secure_ds_simple_secure_no_rtps_protection_pub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_ds_simple_secure_no_rtps_protection_sub_profile.xml b/test/dds/communication/security/secure_ds_simple_secure_no_rtps_protection_sub_profile.xml index 8172523e19c..b2eb6faca6a 100644 --- a/test/dds/communication/security/secure_ds_simple_secure_no_rtps_protection_sub_profile.xml +++ b/test/dds/communication/security/secure_ds_simple_secure_no_rtps_protection_sub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_msg_crypto_besteffort_pub_profile.xml b/test/dds/communication/security/secure_msg_crypto_besteffort_pub_profile.xml index a8b0da4aa21..f022141dbbc 100644 --- a/test/dds/communication/security/secure_msg_crypto_besteffort_pub_profile.xml +++ b/test/dds/communication/security/secure_msg_crypto_besteffort_pub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_msg_crypto_besteffort_sub_profile.xml b/test/dds/communication/security/secure_msg_crypto_besteffort_sub_profile.xml index 11f7ad221e0..5be687ec398 100644 --- a/test/dds/communication/security/secure_msg_crypto_besteffort_sub_profile.xml +++ b/test/dds/communication/security/secure_msg_crypto_besteffort_sub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_msg_submsg_crypto_besteffort_pub_profile.xml b/test/dds/communication/security/secure_msg_submsg_crypto_besteffort_pub_profile.xml index 9ef1dc299b2..52893db85ad 100644 --- a/test/dds/communication/security/secure_msg_submsg_crypto_besteffort_pub_profile.xml +++ b/test/dds/communication/security/secure_msg_submsg_crypto_besteffort_pub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_msg_submsg_crypto_besteffort_sub_profile.xml b/test/dds/communication/security/secure_msg_submsg_crypto_besteffort_sub_profile.xml index b5e48af3d92..aa75b05141b 100644 --- a/test/dds/communication/security/secure_msg_submsg_crypto_besteffort_sub_profile.xml +++ b/test/dds/communication/security/secure_msg_submsg_crypto_besteffort_sub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_simple_ds_server_idx_1_profile.xml b/test/dds/communication/security/secure_simple_ds_server_idx_1_profile.xml index ee92d2bc6a9..404383ebbe5 100644 --- a/test/dds/communication/security/secure_simple_ds_server_idx_1_profile.xml +++ b/test/dds/communication/security/secure_simple_ds_server_idx_1_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_simple_ds_server_no_discovery_no_rtps_protection_idx_1_profile.xml b/test/dds/communication/security/secure_simple_ds_server_no_discovery_no_rtps_protection_idx_1_profile.xml index 18739cc8481..243f66392cb 100644 --- a/test/dds/communication/security/secure_simple_ds_server_no_discovery_no_rtps_protection_idx_1_profile.xml +++ b/test/dds/communication/security/secure_simple_ds_server_no_discovery_no_rtps_protection_idx_1_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_simple_ds_server_no_discovery_no_rtps_protection_profile.xml b/test/dds/communication/security/secure_simple_ds_server_no_discovery_no_rtps_protection_profile.xml index 57adffd2844..e1c4a06da34 100644 --- a/test/dds/communication/security/secure_simple_ds_server_no_discovery_no_rtps_protection_profile.xml +++ b/test/dds/communication/security/secure_simple_ds_server_no_discovery_no_rtps_protection_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_simple_ds_server_no_discovery_protection_idx_1_profile.xml b/test/dds/communication/security/secure_simple_ds_server_no_discovery_protection_idx_1_profile.xml index 5d7010121d3..2426ff96639 100644 --- a/test/dds/communication/security/secure_simple_ds_server_no_discovery_protection_idx_1_profile.xml +++ b/test/dds/communication/security/secure_simple_ds_server_no_discovery_protection_idx_1_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_simple_ds_server_no_discovery_protection_profile.xml b/test/dds/communication/security/secure_simple_ds_server_no_discovery_protection_profile.xml index 82175b9b68f..08a295625e3 100644 --- a/test/dds/communication/security/secure_simple_ds_server_no_discovery_protection_profile.xml +++ b/test/dds/communication/security/secure_simple_ds_server_no_discovery_protection_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_simple_ds_server_no_rtps_protection_idx_1_profile.xml b/test/dds/communication/security/secure_simple_ds_server_no_rtps_protection_idx_1_profile.xml index c57ae82d530..e8eaf50aeed 100644 --- a/test/dds/communication/security/secure_simple_ds_server_no_rtps_protection_idx_1_profile.xml +++ b/test/dds/communication/security/secure_simple_ds_server_no_rtps_protection_idx_1_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_simple_ds_server_no_rtps_protection_profile.xml b/test/dds/communication/security/secure_simple_ds_server_no_rtps_protection_profile.xml index 1d548ccf6e2..a024b72dea7 100644 --- a/test/dds/communication/security/secure_simple_ds_server_no_rtps_protection_profile.xml +++ b/test/dds/communication/security/secure_simple_ds_server_no_rtps_protection_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_simple_ds_server_profile.xml b/test/dds/communication/security/secure_simple_ds_server_profile.xml index d741049a584..2bc227f8104 100644 --- a/test/dds/communication/security/secure_simple_ds_server_profile.xml +++ b/test/dds/communication/security/secure_simple_ds_server_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_submsg_crypto_besteffort_pub_profile.xml b/test/dds/communication/security/secure_submsg_crypto_besteffort_pub_profile.xml index 0c31e5217d8..980504e7765 100644 --- a/test/dds/communication/security/secure_submsg_crypto_besteffort_pub_profile.xml +++ b/test/dds/communication/security/secure_submsg_crypto_besteffort_pub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/secure_submsg_crypto_besteffort_sub_profile.xml b/test/dds/communication/security/secure_submsg_crypto_besteffort_sub_profile.xml index 3a51a3a1012..1620727e044 100644 --- a/test/dds/communication/security/secure_submsg_crypto_besteffort_sub_profile.xml +++ b/test/dds/communication/security/secure_submsg_crypto_besteffort_sub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/simple_allow_unauthenticated_sub_profile.xml b/test/dds/communication/security/simple_allow_unauthenticated_sub_profile.xml index 88300420d49..b0ce55d62bd 100644 --- a/test/dds/communication/security/simple_allow_unauthenticated_sub_profile.xml +++ b/test/dds/communication/security/simple_allow_unauthenticated_sub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/simple_secure_allow_unauthenticated_pub_profile.xml b/test/dds/communication/security/simple_secure_allow_unauthenticated_pub_profile.xml index dcd0b5a37b6..1bd3d1b73b2 100644 --- a/test/dds/communication/security/simple_secure_allow_unauthenticated_pub_profile.xml +++ b/test/dds/communication/security/simple_secure_allow_unauthenticated_pub_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/dds/communication/security/simple_secure_besteffort_pub_profile.xml b/test/dds/communication/security/simple_secure_besteffort_pub_profile.xml index da5820e56f0..22cc6eb66f4 100644 --- a/test/dds/communication/security/simple_secure_besteffort_pub_profile.xml +++ b/test/dds/communication/security/simple_secure_besteffort_pub_profile.xml @@ -1,5 +1,5 @@ - + FULL diff --git a/test/dds/communication/security/simple_secure_besteffort_sub_profile.xml b/test/dds/communication/security/simple_secure_besteffort_sub_profile.xml index 9fff7930fe8..f3ab9d334d3 100644 --- a/test/dds/communication/security/simple_secure_besteffort_sub_profile.xml +++ b/test/dds/communication/security/simple_secure_besteffort_sub_profile.xml @@ -1,5 +1,5 @@ - + FULL diff --git a/test/dds/communication/shm_communication_subscriber_dies_while_processing_message_profile.xml b/test/dds/communication/shm_communication_subscriber_dies_while_processing_message_profile.xml index e76ad1ca6f6..9e43402a7fb 100644 --- a/test/dds/communication/shm_communication_subscriber_dies_while_processing_message_profile.xml +++ b/test/dds/communication/shm_communication_subscriber_dies_while_processing_message_profile.xml @@ -1,5 +1,5 @@ - + OFF diff --git a/test/dds/communication/simple_besteffort_profile.xml b/test/dds/communication/simple_besteffort_profile.xml index af72629ec6d..72c84aad1ff 100644 --- a/test/dds/communication/simple_besteffort_profile.xml +++ b/test/dds/communication/simple_besteffort_profile.xml @@ -1,5 +1,5 @@ - + FULL diff --git a/test/dds/communication/simple_besteffort_zerocopy_profile.xml b/test/dds/communication/simple_besteffort_zerocopy_profile.xml index 75b0f71455c..37b1c29bfd3 100644 --- a/test/dds/communication/simple_besteffort_zerocopy_profile.xml +++ b/test/dds/communication/simple_besteffort_zerocopy_profile.xml @@ -1,5 +1,5 @@ - + FULL diff --git a/test/dds/communication/simple_reliable_profile.xml b/test/dds/communication/simple_reliable_profile.xml index 51e7cc3d96e..df69fc4e609 100644 --- a/test/dds/communication/simple_reliable_profile.xml +++ b/test/dds/communication/simple_reliable_profile.xml @@ -1,5 +1,5 @@ - + FULL diff --git a/test/dds/communication/simple_reliable_zerocopy_profile.xml b/test/dds/communication/simple_reliable_zerocopy_profile.xml index 00ce9ad4efa..a024c4eddd9 100644 --- a/test/dds/communication/simple_reliable_zerocopy_profile.xml +++ b/test/dds/communication/simple_reliable_zerocopy_profile.xml @@ -1,5 +1,5 @@ - + FULL diff --git a/test/dds/discovery/CMakeLists.txt b/test/dds/discovery/CMakeLists.txt index fd4ec7eaed1..7927a77f91e 100644 --- a/test/dds/discovery/CMakeLists.txt +++ b/test/dds/discovery/CMakeLists.txt @@ -30,7 +30,7 @@ if(NOT ((MSVC OR MSVC_IDE) AND EPROSIMA_INSTALLER) AND fastcdr_FOUND) ) target_link_libraries(DDSParticipantDiscovery fastcdr - fastrtps + fastdds ${CMAKE_DL_LIBS} ) diff --git a/test/dds/discovery/ParticipantModule.cpp b/test/dds/discovery/ParticipantModule.cpp index 80fb953cb8f..17f38dfdf19 100644 --- a/test/dds/discovery/ParticipantModule.cpp +++ b/test/dds/discovery/ParticipantModule.cpp @@ -87,8 +87,10 @@ bool ParticipantModule::init() void ParticipantModule::on_participant_discovery( DomainParticipant* participant, - ParticipantDiscoveryInfo&& info) + ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) { + static_cast(should_be_ignored); if (info.status == ParticipantDiscoveryInfo::DISCOVERED_PARTICIPANT) { std::cout << "Participant " << participant->guid() << " discovered participant " << info.info.m_guid << ": " diff --git a/test/dds/discovery/ParticipantModule.hpp b/test/dds/discovery/ParticipantModule.hpp index 53073911104..4e80b4232ad 100644 --- a/test/dds/discovery/ParticipantModule.hpp +++ b/test/dds/discovery/ParticipantModule.hpp @@ -46,7 +46,8 @@ class ParticipantModule : public DomainParticipantListener void on_participant_discovery( DomainParticipant* participant, - ParticipantDiscoveryInfo&& info) override; + ParticipantDiscoveryInfo&& info, + bool& should_be_ignored) override; bool init(); diff --git a/test/mock/dds/QosPolicies/fastdds/dds/core/policy/QosPolicies.hpp b/test/mock/dds/QosPolicies/fastdds/dds/core/policy/QosPolicies.hpp index 926399187d2..035109c9fb7 100644 --- a/test/mock/dds/QosPolicies/fastdds/dds/core/policy/QosPolicies.hpp +++ b/test/mock/dds/QosPolicies/fastdds/dds/core/policy/QosPolicies.hpp @@ -20,11 +20,12 @@ #ifndef _FASTDDS_DDS_QOS_QOSPOLICIES_HPP_ #define _FASTDDS_DDS_QOS_QOSPOLICIES_HPP_ -#include #include -#include -#include -#include +#include + +#include +#include +#include #include namespace eprosima { diff --git a/test/mock/rtps/EDP/fastdds/rtps/builtin/discovery/endpoint/EDP.h b/test/mock/rtps/EDP/fastdds/rtps/builtin/discovery/endpoint/EDP.h index 86096f0ebe5..219d524fc04 100644 --- a/test/mock/rtps/EDP/fastdds/rtps/builtin/discovery/endpoint/EDP.h +++ b/test/mock/rtps/EDP/fastdds/rtps/builtin/discovery/endpoint/EDP.h @@ -19,15 +19,15 @@ #ifndef _FASTDDS_RTPS_EDP_H_ #define _FASTDDS_RTPS_EDP_H_ -#include -#include -#include -#include -#include -#include - #include +#include +#include +#include +#include +#include +#include + namespace eprosima { namespace fastrtps { namespace rtps { diff --git a/test/mock/rtps/MessageReceiver/fastdds/rtps/messages/MessageReceiver.h b/test/mock/rtps/MessageReceiver/fastdds/rtps/messages/MessageReceiver.h index 48a175cc5bf..8c149cb7fdf 100644 --- a/test/mock/rtps/MessageReceiver/fastdds/rtps/messages/MessageReceiver.h +++ b/test/mock/rtps/MessageReceiver/fastdds/rtps/messages/MessageReceiver.h @@ -21,9 +21,10 @@ #ifndef _FASTDDS_RTPS_MESSAGERECEIVER_H_ #define _FASTDDS_RTPS_MESSAGERECEIVER_H_ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC -#include -#include -#include + +#include +#include +#include namespace eprosima { diff --git a/test/mock/rtps/NetworkFactory/rtps/network/NetworkFactory.h b/test/mock/rtps/NetworkFactory/rtps/network/NetworkFactory.h index 8871da212a1..8ac0fdce9a8 100644 --- a/test/mock/rtps/NetworkFactory/rtps/network/NetworkFactory.h +++ b/test/mock/rtps/NetworkFactory/rtps/network/NetworkFactory.h @@ -18,10 +18,10 @@ #include #include +#include +#include #include -#include -#include -#include +#include #include @@ -32,7 +32,7 @@ namespace rtps { class RTPSParticipantAttributes; /** - * Provides the FastRTPS library with abstract resources, which + * Provides the Fast DDS library with abstract resources, which * in turn manage the SEND and RECEIVE operations over some transport. * Once a transport is registered, it becomes invisible to the library * and is abstracted away for good. diff --git a/test/mock/rtps/PDP/fastdds/rtps/builtin/discovery/participant/PDP.h b/test/mock/rtps/PDP/fastdds/rtps/builtin/discovery/participant/PDP.h index c2d3f232f60..edaa7d73fd8 100644 --- a/test/mock/rtps/PDP/fastdds/rtps/builtin/discovery/participant/PDP.h +++ b/test/mock/rtps/PDP/fastdds/rtps/builtin/discovery/participant/PDP.h @@ -19,14 +19,14 @@ #ifndef _FASTDDS_RTPS_BUILTIN_DISCOVERY_PARTICIPANT_PDP_H_ #define _FASTDDS_RTPS_BUILTIN_DISCOVERY_PARTICIPANT_PDP_H_ -#include -#include -#include -#include -#include - #include +#include +#include +#include +#include +#include + namespace eprosima { namespace fastdds { diff --git a/test/mock/rtps/PDPSimple/fastdds/rtps/builtin/discovery/participant/PDPSimple.h b/test/mock/rtps/PDPSimple/fastdds/rtps/builtin/discovery/participant/PDPSimple.h index eb2d4de8a68..f033f83abf4 100644 --- a/test/mock/rtps/PDPSimple/fastdds/rtps/builtin/discovery/participant/PDPSimple.h +++ b/test/mock/rtps/PDPSimple/fastdds/rtps/builtin/discovery/participant/PDPSimple.h @@ -19,13 +19,13 @@ #ifndef _FASTDDS_RTPS_BUILTIN_DISCOVERY_PARTICIPANT_PDPSIMPLE_H_ #define _FASTDDS_RTPS_BUILTIN_DISCOVERY_PARTICIPANT_PDPSIMPLE_H_ -#include -#include -#include -#include - #include +#include +#include +#include +#include + namespace eprosima { namespace fastrtps { namespace rtps { diff --git a/test/mock/rtps/ParticipantProxyData/fastdds/rtps/builtin/data/ParticipantProxyData.h b/test/mock/rtps/ParticipantProxyData/fastdds/rtps/builtin/data/ParticipantProxyData.h index 9c80991e8be..6b2d8a817af 100644 --- a/test/mock/rtps/ParticipantProxyData/fastdds/rtps/builtin/data/ParticipantProxyData.h +++ b/test/mock/rtps/ParticipantProxyData/fastdds/rtps/builtin/data/ParticipantProxyData.h @@ -18,15 +18,15 @@ #ifndef _FASTDDS_RTPS_BUILTIN_DATA_PARTICIPANTPROXYDATA_H_ #define _FASTDDS_RTPS_BUILTIN_DATA_PARTICIPANTPROXYDATA_H_ +#include +#include +#include +#include +#include +#include #include -#include -#include -#include -#include -#include -#include #if HAVE_SECURITY -#include +#include #endif // if HAVE_SECURITY namespace eprosima { diff --git a/test/mock/rtps/RTPSGapBuilder/rtps/messages/RTPSGapBuilder.hpp b/test/mock/rtps/RTPSGapBuilder/rtps/messages/RTPSGapBuilder.hpp index 1b3c6021408..4b162ac4d13 100644 --- a/test/mock/rtps/RTPSGapBuilder/rtps/messages/RTPSGapBuilder.hpp +++ b/test/mock/rtps/RTPSGapBuilder/rtps/messages/RTPSGapBuilder.hpp @@ -20,7 +20,7 @@ #ifndef RTPSGAPBUILDER_HPP #define RTPSGAPBUILDER_HPP -#include +#include namespace eprosima { namespace fastrtps { diff --git a/test/mock/rtps/RTPSParticipant/fastdds/rtps/participant/RTPSParticipant.h b/test/mock/rtps/RTPSParticipant/fastdds/rtps/participant/RTPSParticipant.h index 26326c84327..61538871130 100644 --- a/test/mock/rtps/RTPSParticipant/fastdds/rtps/participant/RTPSParticipant.h +++ b/test/mock/rtps/RTPSParticipant/fastdds/rtps/participant/RTPSParticipant.h @@ -19,15 +19,15 @@ #include #include +#include + +#include +#include #include #include #include #include #include -#include -#include - -#include #include @@ -188,28 +188,28 @@ class RTPS_DllAPI RTPSParticipant MOCK_METHOD3(registerWriter, bool( RTPSWriter * Writer, const TopicAttributes& topicAtt, - const WriterQos& wqos)); + const fastdds::dds::WriterQos& wqos)); MOCK_METHOD3(updateWriter, bool( RTPSWriter * Writer, const TopicAttributes& topicAtt, - const WriterQos& wqos)); + const fastdds::dds::WriterQos& wqos)); MOCK_METHOD3(registerReader, bool( RTPSReader * Reader, const TopicAttributes& topicAtt, - const ReaderQos& rqos)); + const fastdds::dds::ReaderQos& rqos)); MOCK_METHOD4(registerReader, bool( RTPSReader * Reader, const TopicAttributes& topicAtt, - const ReaderQos& rqos, + const fastdds::dds::ReaderQos& rqos, const fastdds::rtps::ContentFilterProperty* content_filter)); MOCK_METHOD3(updateReader, bool( RTPSReader * Reader, const TopicAttributes& topicAtt, - const ReaderQos& rqos)); + const fastdds::dds::ReaderQos& rqos)); MOCK_METHOD1(ignore_participant, bool( const GuidPrefix_t& participant_guid)); @@ -217,7 +217,7 @@ class RTPS_DllAPI RTPSParticipant MOCK_METHOD4(updateReader, bool( RTPSReader * Reader, const TopicAttributes& topicAtt, - const ReaderQos& rqos, + const fastdds::dds::ReaderQos& rqos, const fastdds::rtps::ContentFilterProperty* content_filter)); std::vector get_netmask_filter_info() const diff --git a/test/mock/rtps/RTPSParticipantAttributes/fastdds/rtps/attributes/RTPSParticipantAttributes.h b/test/mock/rtps/RTPSParticipantAttributes/fastdds/rtps/attributes/RTPSParticipantAttributes.h index 95188a863e0..5a2bbceaa69 100644 --- a/test/mock/rtps/RTPSParticipantAttributes/fastdds/rtps/attributes/RTPSParticipantAttributes.h +++ b/test/mock/rtps/RTPSParticipantAttributes/fastdds/rtps/attributes/RTPSParticipantAttributes.h @@ -37,8 +37,8 @@ #include #include #include +#include #include -#include #include namespace eprosima { @@ -302,28 +302,6 @@ class DiscoverySettings (this->ignoreParticipantFlags == b.ignoreParticipantFlags); } - /** - * Get the static endpoint XML filename - * @return Static endpoint XML filename - */ - FASTRTPS_DEPRECATED("Use static_edp_xml_config()") - const char* getStaticEndpointXMLFilename() const - { - return static_edp_xml_config(); - } - - /** - * Set the static endpoint XML filename - * @param str Static endpoint XML filename - * @deprecated - */ - FASTRTPS_DEPRECATED("Use static_edp_xml_config()") - void setStaticEndpointXMLFilename( - const char* str) - { - static_edp_xml_config_ = "file://" + std::string(str); - } - /** * Set the static endpoint XML configuration. * @param str URI specifying the static endpoint XML configuration. @@ -526,10 +504,10 @@ class RTPSParticipantAttributes att.userTransports.push_back(descriptor); } - static std::shared_ptr create_udpv4_transport( + static std::shared_ptr create_udpv4_transport( const RTPSParticipantAttributes& att) { - auto descriptor = std::make_shared(); + auto descriptor = std::make_shared(); descriptor->sendBufferSize = att.sendSocketBufferSize; descriptor->receiveBufferSize = att.listenSocketBufferSize; descriptor->default_reception_threads(att.builtin_transports_reception_threads); diff --git a/test/mock/rtps/RTPSParticipantImpl/rtps/participant/RTPSParticipantImpl.h b/test/mock/rtps/RTPSParticipantImpl/rtps/participant/RTPSParticipantImpl.h index 0e541a7e2a6..cbe874cdeae 100644 --- a/test/mock/rtps/RTPSParticipantImpl/rtps/participant/RTPSParticipantImpl.h +++ b/test/mock/rtps/RTPSParticipantImpl/rtps/participant/RTPSParticipantImpl.h @@ -19,24 +19,25 @@ #ifndef _RTPS_PARTICIPANT_RTPSPARTICIPANTIMPL_H_ #define _RTPS_PARTICIPANT_RTPSPARTICIPANTIMPL_H_ +#include +#include +#include + +#include + // Include first possible mocks (depending on include on CMakeLists.txt) -#include -#include -#include -#include -#include -#include +#include #include +#include +#include +#include +#include +#include #if HAVE_SECURITY #include #endif // if HAVE_SECURITY -#include - -#include -#include -#include namespace eprosima { namespace fastrtps { diff --git a/test/mock/rtps/RTPSReader/fastdds/rtps/reader/RTPSReader.h b/test/mock/rtps/RTPSReader/fastdds/rtps/reader/RTPSReader.h index 77743ee37d8..9b29ff7b2c7 100644 --- a/test/mock/rtps/RTPSReader/fastdds/rtps/reader/RTPSReader.h +++ b/test/mock/rtps/RTPSReader/fastdds/rtps/reader/RTPSReader.h @@ -19,17 +19,16 @@ #ifndef _FASTDDS_RTPS_READER_RTPSREADER_H_ #define _FASTDDS_RTPS_READER_RTPSREADER_H_ -#include - -#include -#include -#include -#include -#include -#include - #include +#include +#include +#include +#include +#include +#include +#include + namespace eprosima { namespace fastrtps { namespace rtps { diff --git a/test/mock/rtps/RTPSWriter/fastdds/rtps/writer/RTPSWriter.h b/test/mock/rtps/RTPSWriter/fastdds/rtps/writer/RTPSWriter.h index 9a36a81083c..42ac0cf307b 100644 --- a/test/mock/rtps/RTPSWriter/fastdds/rtps/writer/RTPSWriter.h +++ b/test/mock/rtps/RTPSWriter/fastdds/rtps/writer/RTPSWriter.h @@ -23,15 +23,16 @@ #include +#include +#include +#include #include +#include #include #include #include #include -#include -#include -#include -#include +#include namespace eprosima { namespace fastrtps { @@ -140,7 +141,7 @@ class RTPSWriter : public Endpoint MOCK_METHOD0(getMaxDataSize, uint32_t ()); - MOCK_CONST_METHOD0(get_liveliness_kind, const LivelinessQosPolicyKind& ()); + MOCK_CONST_METHOD0(get_liveliness_kind, const fastdds::dds::LivelinessQosPolicyKind& ()); MOCK_CONST_METHOD0(get_liveliness_lease_duration, const Duration_t& ()); diff --git a/test/mock/rtps/ReaderHistory/fastdds/rtps/history/ReaderHistory.h b/test/mock/rtps/ReaderHistory/fastdds/rtps/history/ReaderHistory.h index 1fd5f344dd0..ff0d864c195 100644 --- a/test/mock/rtps/ReaderHistory/fastdds/rtps/history/ReaderHistory.h +++ b/test/mock/rtps/ReaderHistory/fastdds/rtps/history/ReaderHistory.h @@ -19,15 +19,15 @@ #ifndef _FASTDDS_RTPS_READERHISTORY_H_ #define _FASTDDS_RTPS_READERHISTORY_H_ -#include -#include -#include -#include - #include #include +#include +#include +#include +#include + namespace eprosima { namespace fastrtps { namespace rtps { diff --git a/test/mock/rtps/ReaderLocator/fastdds/rtps/writer/ReaderLocator.h b/test/mock/rtps/ReaderLocator/fastdds/rtps/writer/ReaderLocator.h index dc3be493e06..1c8c99eb265 100644 --- a/test/mock/rtps/ReaderLocator/fastdds/rtps/writer/ReaderLocator.h +++ b/test/mock/rtps/ReaderLocator/fastdds/rtps/writer/ReaderLocator.h @@ -23,13 +23,13 @@ #ifndef DOXYGEN_SHOULD_SKIP_THIS_PUBLIC #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include namespace eprosima { namespace fastrtps { diff --git a/test/mock/rtps/ReaderProxyData/fastdds/rtps/builtin/data/ReaderProxyData.h b/test/mock/rtps/ReaderProxyData/fastdds/rtps/builtin/data/ReaderProxyData.h index 323cfa22540..1bd5eda52d9 100644 --- a/test/mock/rtps/ReaderProxyData/fastdds/rtps/builtin/data/ReaderProxyData.h +++ b/test/mock/rtps/ReaderProxyData/fastdds/rtps/builtin/data/ReaderProxyData.h @@ -21,13 +21,16 @@ #include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include -#include -#include #if HAVE_SECURITY -#include +#include #endif // if HAVE_SECURITY namespace eprosima { @@ -220,17 +223,17 @@ class ReaderProxyData } void type_id( - const TypeIdV1& other_type_id) + const fastdds::dds::TypeIdV1& other_type_id) { type_id_ = other_type_id; } - const TypeIdV1& type_id() const + const fastdds::dds::TypeIdV1& type_id() const { return type_id_; } - TypeIdV1& type_id() + fastdds::dds::TypeIdV1& type_id() { return type_id_; } @@ -241,17 +244,17 @@ class ReaderProxyData } void type( - const TypeObjectV1& other_type) + const fastdds::dds::TypeObjectV1& other_type) { type_ = other_type; } - const TypeObjectV1& type() const + const fastdds::dds::TypeObjectV1& type() const { return type_; } - TypeObjectV1& type() + fastdds::dds::TypeObjectV1& type() { return type_; } @@ -262,17 +265,17 @@ class ReaderProxyData } void type_information( - const xtypes::TypeInformation& other_type_info) + const fastdds::dds::xtypes::TypeInformation& other_type_info) { type_info_ = other_type_info; } - const xtypes::TypeInformation& type_information() const + const fastdds::dds::xtypes::TypeInformation& type_information() const { return type_info_; } - xtypes::TypeInformation& type_information() + fastdds::dds::xtypes::TypeInformation& type_information() { return type_info_; } @@ -378,7 +381,7 @@ class ReaderProxyData RemoteLocatorList remote_locators_; bool m_expectsInlineQos; - ReaderQos m_qos; + fastdds::dds::ReaderQos m_qos; private: @@ -387,9 +390,9 @@ class ReaderProxyData string_255 type_name_; TopicKind_t topic_kind_; bool is_alive_; - TypeIdV1 type_id_; - TypeObjectV1 type_; - xtypes::TypeInformation type_info_; + fastdds::dds::TypeIdV1 type_id_; + fastdds::dds::TypeObjectV1 type_; + fastdds::dds::xtypes::TypeInformation type_info_; InstanceHandle_t m_key; InstanceHandle_t m_RTPSParticipantKey; uint16_t m_userDefinedId; diff --git a/test/mock/rtps/ReceiverResource/rtps/network/ReceiverResource.h b/test/mock/rtps/ReceiverResource/rtps/network/ReceiverResource.h index 1f0ce00b56b..7a38c48af2c 100644 --- a/test/mock/rtps/ReceiverResource/rtps/network/ReceiverResource.h +++ b/test/mock/rtps/ReceiverResource/rtps/network/ReceiverResource.h @@ -16,10 +16,11 @@ #define _FASTDDS_RTPS_RECEIVER_RESOURCE_H #include -#include #include -#include -#include +#include + +#include +#include namespace eprosima { namespace fastrtps { @@ -34,7 +35,7 @@ class RTPSParticipantImpl; * Mock ReceiverResource * @ingroup NETWORK_MODULE */ -class ReceiverResource : public TransportReceiverInterface +class ReceiverResource : public fastdds::rtps::TransportReceiverInterface { friend class NetworkFactory; @@ -99,7 +100,7 @@ class ReceiverResource : public TransportReceiverInterface protected: ReceiverResource( - TransportInterface& transport, + fastdds::rtps::TransportInterface& transport, const Locator_t& locator, uint32_t max_recv_buffer_size) : mValid(false) diff --git a/test/mock/rtps/SecurityManager/rtps/security/SecurityManager.h b/test/mock/rtps/SecurityManager/rtps/security/SecurityManager.h index 738c72a8f9e..ef996c4b1ad 100644 --- a/test/mock/rtps/SecurityManager/rtps/security/SecurityManager.h +++ b/test/mock/rtps/SecurityManager/rtps/security/SecurityManager.h @@ -18,11 +18,11 @@ #ifndef _RTPS_SECURITY_SECURITYMANAGER_H_ #define _RTPS_SECURITY_SECURITYMANAGER_H_ -#include -#include - #include +#include +#include + namespace eprosima { namespace fastrtps { namespace rtps { diff --git a/test/mock/rtps/SecurityPluginFactory/rtps/security/MockAuthenticationPlugin.h b/test/mock/rtps/SecurityPluginFactory/rtps/security/MockAuthenticationPlugin.h index 74462284bce..f5d899962da 100644 --- a/test/mock/rtps/SecurityPluginFactory/rtps/security/MockAuthenticationPlugin.h +++ b/test/mock/rtps/SecurityPluginFactory/rtps/security/MockAuthenticationPlugin.h @@ -21,11 +21,12 @@ // TODO(Ricardo) Change when GMock supports r-values. -#include -#include - #include +#include + +#include + #pragma warning(push) #pragma warning(disable : 4373) diff --git a/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptoKeyExchange.h b/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptoKeyExchange.h index 349b40e26d5..e1458713106 100644 --- a/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptoKeyExchange.h +++ b/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptoKeyExchange.h @@ -13,15 +13,16 @@ // limitations under the License. /*! - * @file MockCryptoKeyExchange.h + * @file MockCryptoKeyExchange.h */ #ifndef _RTPS_SECURITY_MOCKCRYPTOKEYEXCHANGE_H_ #define _RTPS_SECURITY_MOCKCRYPTOKEYEXCHANGE_H_ -#include -#include #include +#include +#include + namespace eprosima { namespace fastrtps { namespace rtps { @@ -29,49 +30,51 @@ namespace security { class MockCryptoKeyExchange : public CryptoKeyExchange { - public: +public: - virtual ~MockCryptoKeyExchange(){} + virtual ~MockCryptoKeyExchange() + { + } - MOCK_METHOD4(create_local_participant_crypto_tokens, bool ( + MOCK_METHOD4(create_local_participant_crypto_tokens, bool ( ParticipantCryptoTokenSeq&, const ParticipantCryptoHandle&, ParticipantCryptoHandle&, - SecurityException&)); + SecurityException &)); - MOCK_METHOD4(set_remote_participant_crypto_tokens, bool ( + MOCK_METHOD4(set_remote_participant_crypto_tokens, bool ( const ParticipantCryptoHandle&, ParticipantCryptoHandle&, const ParticipantCryptoTokenSeq&, - SecurityException&)); + SecurityException &)); - MOCK_METHOD4(create_local_datawriter_crypto_tokens, bool ( + MOCK_METHOD4(create_local_datawriter_crypto_tokens, bool ( DatawriterCryptoTokenSeq&, DatawriterCryptoHandle&, DatareaderCryptoHandle&, - SecurityException&)); + SecurityException &)); - MOCK_METHOD4(create_local_datareader_crypto_tokens, bool ( + MOCK_METHOD4(create_local_datareader_crypto_tokens, bool ( DatareaderCryptoTokenSeq&, DatareaderCryptoHandle&, DatawriterCryptoHandle&, - SecurityException&)); + SecurityException &)); - MOCK_METHOD4(set_remote_datareader_crypto_tokens, bool ( + MOCK_METHOD4(set_remote_datareader_crypto_tokens, bool ( DatawriterCryptoHandle&, DatareaderCryptoHandle&, const DatareaderCryptoTokenSeq&, - SecurityException&)); + SecurityException &)); - MOCK_METHOD4(set_remote_datawriter_crypto_tokens, bool ( + MOCK_METHOD4(set_remote_datawriter_crypto_tokens, bool ( DatareaderCryptoHandle&, DatawriterCryptoHandle&, const DatawriterCryptoTokenSeq&, - SecurityException&)); + SecurityException &)); - MOCK_METHOD2(return_crypto_tokens, bool ( + MOCK_METHOD2(return_crypto_tokens, bool ( const CryptoTokenSeq&, - SecurityException&)); + SecurityException &)); }; diff --git a/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptoKeyFactory.h b/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptoKeyFactory.h index 1de40f6ddfc..29b962c4117 100644 --- a/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptoKeyFactory.h +++ b/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptoKeyFactory.h @@ -18,12 +18,12 @@ #ifndef _RTPS_SECURITY_MOCKCRYPTOKEYFACTORY_H_ #define _RTPS_SECURITY_MOCKCRYPTOKEYFACTORY_H_ -#include -#include +#include -#include +#include +#include -#include +#include #pragma warning(push) #pragma warning(disable : 4373) diff --git a/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptoTransform.h b/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptoTransform.h index 5cc6b2d009c..0aa545c1983 100644 --- a/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptoTransform.h +++ b/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptoTransform.h @@ -18,10 +18,11 @@ #ifndef _RTPS_SECURITY_MOCKCRYPTOTRANSFORM_H_ #define _RTPS_SECURITY_MOCKCRYPTOTRANSFORM_H_ -#include -#include #include +#include +#include + namespace eprosima { namespace fastrtps { namespace rtps { diff --git a/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptographyPlugin.h b/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptographyPlugin.h index 249490f98b1..f6bec989da7 100644 --- a/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptographyPlugin.h +++ b/test/mock/rtps/SecurityPluginFactory/rtps/security/MockCryptographyPlugin.h @@ -19,10 +19,10 @@ #ifndef _RTPS_SECURITY_MOCKCRYPTOGRAPHYPLUGIN_H_ #define _RTPS_SECURITY_MOCKCRYPTOGRAPHYPLUGIN_H_ -#include +#include -#include #include +#include #include namespace eprosima { diff --git a/test/mock/rtps/SecurityPluginFactory/rtps/security/SecurityPluginFactory.h b/test/mock/rtps/SecurityPluginFactory/rtps/security/SecurityPluginFactory.h index 74fe9e1b46d..52a0e4c298f 100644 --- a/test/mock/rtps/SecurityPluginFactory/rtps/security/SecurityPluginFactory.h +++ b/test/mock/rtps/SecurityPluginFactory/rtps/security/SecurityPluginFactory.h @@ -18,11 +18,11 @@ #ifndef _RTPS_SECURITY_SECURITYPLUGINFACTORY_H_ #define _RTPS_SECURITY_SECURITYPLUGINFACTORY_H_ -#include -#include -#include +#include +#include +#include +#include #include -#include #include diff --git a/test/mock/rtps/StatefulReader/fastdds/rtps/reader/StatefulReader.h b/test/mock/rtps/StatefulReader/fastdds/rtps/reader/StatefulReader.h index 5d75efbde10..20e92cdb030 100644 --- a/test/mock/rtps/StatefulReader/fastdds/rtps/reader/StatefulReader.h +++ b/test/mock/rtps/StatefulReader/fastdds/rtps/reader/StatefulReader.h @@ -15,10 +15,10 @@ #ifndef _FASTDDS_RTPS_READER_STATEFULREADER_H_ #define _FASTDDS_RTPS_READER_STATEFULREADER_H_ +#include +#include +#include #include -#include -#include -#include namespace eprosima { namespace fastrtps { diff --git a/test/mock/rtps/StatefulWriter/fastdds/rtps/writer/StatefulWriter.h b/test/mock/rtps/StatefulWriter/fastdds/rtps/writer/StatefulWriter.h index efad06707f9..d4b82eb490f 100644 --- a/test/mock/rtps/StatefulWriter/fastdds/rtps/writer/StatefulWriter.h +++ b/test/mock/rtps/StatefulWriter/fastdds/rtps/writer/StatefulWriter.h @@ -19,9 +19,9 @@ #ifndef _FASTDDS_RTPS_STATEFULWRITER_H_ #define _FASTDDS_RTPS_STATEFULWRITER_H_ -#include -#include -#include +#include +#include +#include namespace eprosima { namespace fastrtps { diff --git a/test/mock/rtps/StatelessReader/fastdds/rtps/reader/StatelessReader.h b/test/mock/rtps/StatelessReader/fastdds/rtps/reader/StatelessReader.h index 1a851b8d9f0..81af7a71809 100644 --- a/test/mock/rtps/StatelessReader/fastdds/rtps/reader/StatelessReader.h +++ b/test/mock/rtps/StatelessReader/fastdds/rtps/reader/StatelessReader.h @@ -19,7 +19,7 @@ #ifndef _FASTDDS_RTPS_READER_STATELESSREADER_H_ #define _FASTDDS_RTPS_READER_STATELESSREADER_H_ -#include +#include namespace eprosima { namespace fastrtps { diff --git a/test/mock/rtps/StatelessWriter/fastdds/rtps/writer/StatelessWriter.h b/test/mock/rtps/StatelessWriter/fastdds/rtps/writer/StatelessWriter.h index a9701fd272d..d81fb836dd7 100644 --- a/test/mock/rtps/StatelessWriter/fastdds/rtps/writer/StatelessWriter.h +++ b/test/mock/rtps/StatelessWriter/fastdds/rtps/writer/StatelessWriter.h @@ -19,7 +19,7 @@ #ifndef _FASTDDS_RTPS_STATELESSWRITER_H_ #define _FASTDDS_RTPS_STATELESSWRITER_H_ -#include +#include namespace eprosima { namespace fastrtps { diff --git a/test/mock/rtps/TCPTransportDescriptor/fastrtps/transport/TCPTransportDescriptor.h b/test/mock/rtps/TCPTransportDescriptor/fastdds/rtps/transport/TCPTransportDescriptor.h similarity index 96% rename from test/mock/rtps/TCPTransportDescriptor/fastrtps/transport/TCPTransportDescriptor.h rename to test/mock/rtps/TCPTransportDescriptor/fastdds/rtps/transport/TCPTransportDescriptor.h index a4a4ec26e0f..13cf6d14e7f 100644 --- a/test/mock/rtps/TCPTransportDescriptor/fastrtps/transport/TCPTransportDescriptor.h +++ b/test/mock/rtps/TCPTransportDescriptor/fastdds/rtps/transport/TCPTransportDescriptor.h @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef TCP_TRANSPORT_DESCRIPTOR_H -#define TCP_TRANSPORT_DESCRIPTOR_H +#ifndef _FASTDDS_TCP_TRANSPORT_DESCRIPTOR_H_ +#define _FASTDDS_TCP_TRANSPORT_DESCRIPTOR_H_ -#include +#include namespace eprosima { -namespace fastrtps { +namespace fastdds { namespace rtps { /** @@ -207,7 +207,7 @@ typedef struct TCPTransportDescriptor : public SocketTransportDescriptor } TCPTransportDescriptor; } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima -#endif // TCP_TRANSPORT_DESCRIPTOR_H +#endif // _FASTDDS_TCP_TRANSPORT_DESCRIPTOR_H_ diff --git a/test/mock/rtps/TCPv4TransportDescriptor/fastdds/rtps/transport/TCPv4TransportDescriptor.h b/test/mock/rtps/TCPv4TransportDescriptor/fastdds/rtps/transport/TCPv4TransportDescriptor.h new file mode 100644 index 00000000000..89e266118a8 --- /dev/null +++ b/test/mock/rtps/TCPv4TransportDescriptor/fastdds/rtps/transport/TCPv4TransportDescriptor.h @@ -0,0 +1,86 @@ +// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef _FASTDDS_TCPV4_TRANSPORT_DESCRIPTOR_ +#define _FASTDDS_TCPV4_TRANSPORT_DESCRIPTOR_ + +#include +#include + +namespace eprosima { +namespace fastdds { +namespace rtps { + +class TCPTransportInterface; +/** + * Transport configuration + * @ingroup TRANSPORT_MODULE + */ +typedef struct TCPv4TransportDescriptor : public TCPTransportDescriptor +{ + virtual ~TCPv4TransportDescriptor() + { + } + + virtual TransportInterface* create_transport() const override + { + return nullptr; + } + + eprosima::fastrtps::rtps::octet wan_addr[4]; + + void set_WAN_address( + eprosima::fastrtps::rtps::octet o1, + eprosima::fastrtps::rtps::octet o2, + eprosima::fastrtps::rtps::octet o3, + eprosima::fastrtps::rtps::octet o4) + { + wan_addr[0] = o1; + wan_addr[1] = o2; + wan_addr[2] = o3; + wan_addr[3] = o4; + } + + void set_WAN_address( + const std::string& in_address) + { + std::stringstream ss(in_address); + int a, b, c, d; //to store the 4 ints + char ch; //to temporarily store the '.' + ss >> a >> ch >> b >> ch >> c >> ch >> d; + wan_addr[0] = (eprosima::fastrtps::rtps::octet)a; + wan_addr[1] = (eprosima::fastrtps::rtps::octet)b; + wan_addr[2] = (eprosima::fastrtps::rtps::octet)c; + wan_addr[3] = (eprosima::fastrtps::rtps::octet)d; + } + + RTPS_DllAPI TCPv4TransportDescriptor() + { + + } + + RTPS_DllAPI TCPv4TransportDescriptor( + const TCPv4TransportDescriptor& /*t*/) + : TCPv4TransportDescriptor() + { + + } + +} TCPv4TransportDescriptor; + +} // namespace rtps +} // namespace fastdds +} // namespace eprosima + +#endif // _FASTDDS_TCPV4_TRANSPORT_DESCRIPTOR_ diff --git a/test/mock/rtps/TCPv4TransportDescriptor/fastrtps/transport/TCPv4TransportDescriptor.h b/test/mock/rtps/TCPv4TransportDescriptor/fastrtps/transport/TCPv4TransportDescriptor.h deleted file mode 100644 index 9df80685edf..00000000000 --- a/test/mock/rtps/TCPv4TransportDescriptor/fastrtps/transport/TCPv4TransportDescriptor.h +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef TCPV4_TRANSPORT_DESCRIPTOR -#define TCPV4_TRANSPORT_DESCRIPTOR - -#include - -namespace eprosima{ -namespace fastrtps{ -namespace rtps{ - -class TCPTransportInterface; -/** - * Transport configuration - * @ingroup TRANSPORT_MODULE - */ -typedef struct TCPv4TransportDescriptor: public TCPTransportDescriptor { - virtual ~TCPv4TransportDescriptor(){} - - virtual TransportInterface* create_transport() const override { return nullptr; } - - octet wan_addr[4]; - - void set_WAN_address(octet o1,octet o2,octet o3,octet o4){ - wan_addr[0] = o1; - wan_addr[1] = o2; - wan_addr[2] = o3; - wan_addr[3] = o4; - } - - void set_WAN_address(const std::string& in_address) - { - std::stringstream ss(in_address); - int a,b,c,d; //to store the 4 ints - char ch; //to temporarily store the '.' - ss >> a >> ch >> b >> ch >> c >> ch >> d; - wan_addr[0] = (octet)a; - wan_addr[1] = (octet)b; - wan_addr[2] = (octet)c; - wan_addr[3] = (octet)d; - } - - RTPS_DllAPI TCPv4TransportDescriptor() - { - - } - - RTPS_DllAPI TCPv4TransportDescriptor(const TCPv4TransportDescriptor& /*t*/) : TCPv4TransportDescriptor() - { - - } - -} TCPv4TransportDescriptor; - -} // namespace rtps -} // namespace fastrtps -} // namespace eprosima - -#endif diff --git a/test/mock/rtps/TCPv6TransportDescriptor/fastrtps/transport/TCPv6TransportDescriptor.h b/test/mock/rtps/TCPv6TransportDescriptor/fastdds/rtps/transport/TCPv6TransportDescriptor.h similarity index 67% rename from test/mock/rtps/TCPv6TransportDescriptor/fastrtps/transport/TCPv6TransportDescriptor.h rename to test/mock/rtps/TCPv6TransportDescriptor/fastdds/rtps/transport/TCPv6TransportDescriptor.h index cddd881750d..a14b9831b1a 100644 --- a/test/mock/rtps/TCPv6TransportDescriptor/fastrtps/transport/TCPv6TransportDescriptor.h +++ b/test/mock/rtps/TCPv6TransportDescriptor/fastdds/rtps/transport/TCPv6TransportDescriptor.h @@ -12,14 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef TCPV6_TRANSPORT_DESCRIPTOR -#define TCPV6_TRANSPORT_DESCRIPTOR +#ifndef _FASTDDS_TCPV6_TRANSPORT_DESCRIPTOR_ +#define _FASTDDS_TCPV6_TRANSPORT_DESCRIPTOR_ -#include +#include -namespace eprosima{ -namespace fastrtps{ -namespace rtps{ +namespace eprosima { +namespace fastdds { +namespace rtps { class TCPTransportInterface; @@ -33,18 +33,25 @@ class TCPTransportInterface; * - interfaceWhiteList: Lists the allowed interfaces. * @ingroup TRANSPORT_MODULE */ -typedef struct TCPv6TransportDescriptor: public TCPTransportDescriptor +typedef struct TCPv6TransportDescriptor : public TCPTransportDescriptor { - virtual ~TCPv6TransportDescriptor(){} + virtual ~TCPv6TransportDescriptor() + { + } - virtual TransportInterface* create_transport() const override { return nullptr; } + virtual TransportInterface* create_transport() const override + { + return nullptr; + } RTPS_DllAPI TCPv6TransportDescriptor() { } - RTPS_DllAPI TCPv6TransportDescriptor(const TCPv6TransportDescriptor& /*t*/) : TCPv6TransportDescriptor() + RTPS_DllAPI TCPv6TransportDescriptor( + const TCPv6TransportDescriptor& /*t*/) + : TCPv6TransportDescriptor() { } @@ -52,7 +59,7 @@ typedef struct TCPv6TransportDescriptor: public TCPTransportDescriptor } TCPv6TransportDescriptor; } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima -#endif +#endif // _FASTDDS_TCPV6_TRANSPORT_DESCRIPTOR_ diff --git a/test/mock/rtps/TimedEvent/fastdds/rtps/resources/TimedEvent.h b/test/mock/rtps/TimedEvent/fastdds/rtps/resources/TimedEvent.h index 29e01813ecb..f13d449b03d 100644 --- a/test/mock/rtps/TimedEvent/fastdds/rtps/resources/TimedEvent.h +++ b/test/mock/rtps/TimedEvent/fastdds/rtps/resources/TimedEvent.h @@ -15,11 +15,11 @@ #ifndef _FASTDDS_RTPS_RESOURCES_TIMEDEVENT_H_ #define _FASTDDS_RTPS_RESOURCES_TIMEDEVENT_H_ -#include +#include -#include +#include -#include +#include namespace eprosima { namespace fastrtps { diff --git a/test/mock/rtps/UDPTransportDescriptor/fastrtps/transport/UDPTransportDescriptor.h b/test/mock/rtps/UDPTransportDescriptor/fastdds/rtps/transport/UDPTransportDescriptor.h similarity index 56% rename from test/mock/rtps/UDPTransportDescriptor/fastrtps/transport/UDPTransportDescriptor.h rename to test/mock/rtps/UDPTransportDescriptor/fastdds/rtps/transport/UDPTransportDescriptor.h index 0914643beb3..8a1a4b5716d 100644 --- a/test/mock/rtps/UDPTransportDescriptor/fastrtps/transport/UDPTransportDescriptor.h +++ b/test/mock/rtps/UDPTransportDescriptor/fastdds/rtps/transport/UDPTransportDescriptor.h @@ -12,14 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef UDP_TRANSPORT_DESCRIPTOR -#define UDP_TRANSPORT_DESCRIPTOR +#ifndef _FASTDDS_UDP_TRANSPORT_DESCRIPTOR_ +#define _FASTDDS_UDP_TRANSPORT_DESCRIPTOR_ -#include +#include -namespace eprosima{ -namespace fastrtps{ -namespace rtps{ +namespace eprosima { +namespace fastdds { +namespace rtps { using TransportInterface = fastdds::rtps::TransportInterface; @@ -33,31 +33,37 @@ using TransportInterface = fastdds::rtps::TransportInterface; * - interfaceWhiteList: Lists the allowed interfaces. * @ingroup TRANSPORT_MODULE */ -typedef struct UDPTransportDescriptor: public SocketTransportDescriptor +typedef struct UDPTransportDescriptor : public SocketTransportDescriptor { - virtual ~UDPTransportDescriptor(){} + virtual ~UDPTransportDescriptor() + { + } - virtual TransportInterface* create_transport() const override { return nullptr; } + virtual TransportInterface* create_transport() const override + { + return nullptr; + } - RTPS_DllAPI UDPTransportDescriptor() - : SocketTransportDescriptor(65550, 4) - { + RTPS_DllAPI UDPTransportDescriptor() + : SocketTransportDescriptor(65550, 4) + { - } + } - RTPS_DllAPI UDPTransportDescriptor(const UDPTransportDescriptor& /*t*/) - : SocketTransportDescriptor(65550, 4) - { + RTPS_DllAPI UDPTransportDescriptor( + const UDPTransportDescriptor& /*t*/) + : SocketTransportDescriptor(65550, 4) + { - } + } - uint16_t m_output_udp_socket; - - bool non_blocking_send = false; + uint16_t m_output_udp_socket; + + bool non_blocking_send = false; } UDPTransportDescriptor; } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima -#endif +#endif // _FASTDDS_UDP_TRANSPORT_DESCRIPTOR_ diff --git a/test/mock/rtps/UDPv4TransportDescriptor/fastrtps/transport/UDPv4TransportDescriptor.h b/test/mock/rtps/UDPv4TransportDescriptor/fastdds/rtps/transport/UDPv4TransportDescriptor.h similarity index 63% rename from test/mock/rtps/UDPv4TransportDescriptor/fastrtps/transport/UDPv4TransportDescriptor.h rename to test/mock/rtps/UDPv4TransportDescriptor/fastdds/rtps/transport/UDPv4TransportDescriptor.h index 111f9c11850..3b43924a4c4 100644 --- a/test/mock/rtps/UDPv4TransportDescriptor/fastrtps/transport/UDPv4TransportDescriptor.h +++ b/test/mock/rtps/UDPv4TransportDescriptor/fastdds/rtps/transport/UDPv4TransportDescriptor.h @@ -12,14 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef UDPV4_TRANSPORT_DESCRIPTOR -#define UDPV4_TRANSPORT_DESCRIPTOR +#ifndef _FASTDDS_UDPV4_TRANSPORT_DESCRIPTOR +#define _FASTDDS_UDPV4_TRANSPORT_DESCRIPTOR -#include +#include -namespace eprosima{ -namespace fastrtps{ -namespace rtps{ +namespace eprosima { +namespace fastdds { +namespace rtps { using TransportInterface = fastdds::rtps::TransportInterface; @@ -33,25 +33,29 @@ using TransportInterface = fastdds::rtps::TransportInterface; * - interfaceWhiteList: Lists the allowed interfaces. * @ingroup TRANSPORT_MODULE */ -typedef struct UDPv4TransportDescriptor: public UDPTransportDescriptor +typedef struct UDPv4TransportDescriptor : public UDPTransportDescriptor { - virtual ~UDPv4TransportDescriptor(){} + virtual ~UDPv4TransportDescriptor() + { + } - RTPS_DllAPI UDPv4TransportDescriptor() - : UDPTransportDescriptor() - { + RTPS_DllAPI UDPv4TransportDescriptor() + : UDPTransportDescriptor() + { - } + } - RTPS_DllAPI UDPv4TransportDescriptor(const UDPv4TransportDescriptor& /*t*/) - : UDPTransportDescriptor() - { + RTPS_DllAPI UDPv4TransportDescriptor( + const UDPv4TransportDescriptor& /*t*/) + : UDPTransportDescriptor() + { + + } - } } UDPv4TransportDescriptor; } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima -#endif +#endif // _FASTDDS_UDPV4_TRANSPORT_DESCRIPTOR diff --git a/test/mock/rtps/UDPv6TransportDescriptor/fastrtps/transport/UDPv6TransportDescriptor.h b/test/mock/rtps/UDPv6TransportDescriptor/fastdds/rtps/transport/UDPv6TransportDescriptor.h similarity index 62% rename from test/mock/rtps/UDPv6TransportDescriptor/fastrtps/transport/UDPv6TransportDescriptor.h rename to test/mock/rtps/UDPv6TransportDescriptor/fastdds/rtps/transport/UDPv6TransportDescriptor.h index 8d6104f6fda..2a2b25a0522 100644 --- a/test/mock/rtps/UDPv6TransportDescriptor/fastrtps/transport/UDPv6TransportDescriptor.h +++ b/test/mock/rtps/UDPv6TransportDescriptor/fastdds/rtps/transport/UDPv6TransportDescriptor.h @@ -12,14 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef UDPV6_TRANSPORT_DESCRIPTOR -#define UDPV6_TRANSPORT_DESCRIPTOR +#ifndef _FASTDDS_UDPV6_TRANSPORT_DESCRIPTOR_ +#define _FASTDDS_UDPV6_TRANSPORT_DESCRIPTOR_ -#include +#include -namespace eprosima{ -namespace fastrtps{ -namespace rtps{ +namespace eprosima { +namespace fastdds { +namespace rtps { using TransportInterface = fastdds::rtps::TransportInterface; @@ -33,25 +33,29 @@ using TransportInterface = fastdds::rtps::TransportInterface; * - interfaceWhiteList: Lists the allowed interfaces. * @ingroup TRANSPORT_MODULE */ -typedef struct UDPv6TransportDescriptor: public UDPTransportDescriptor +typedef struct UDPv6TransportDescriptor : public UDPTransportDescriptor { - virtual ~UDPv6TransportDescriptor(){} + virtual ~UDPv6TransportDescriptor() + { + } - RTPS_DllAPI UDPv6TransportDescriptor() - : UDPTransportDescriptor() - { + RTPS_DllAPI UDPv6TransportDescriptor() + : UDPTransportDescriptor() + { - } + } - RTPS_DllAPI UDPv6TransportDescriptor(const UDPv6TransportDescriptor& /*t*/) - : UDPTransportDescriptor() - { + RTPS_DllAPI UDPv6TransportDescriptor( + const UDPv6TransportDescriptor& /*t*/) + : UDPTransportDescriptor() + { + + } - } } UDPv6TransportDescriptor; } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima -#endif +#endif // _FASTDDS_UDPV6_TRANSPORT_DESCRIPTOR_ diff --git a/test/mock/rtps/WLP/fastdds/rtps/builtin/liveliness/WLP.h b/test/mock/rtps/WLP/fastdds/rtps/builtin/liveliness/WLP.h index 27cfbf6c2d6..290d4b5ce57 100644 --- a/test/mock/rtps/WLP/fastdds/rtps/builtin/liveliness/WLP.h +++ b/test/mock/rtps/WLP/fastdds/rtps/builtin/liveliness/WLP.h @@ -20,12 +20,13 @@ #ifndef _FASTDDS_RTPS_WLP_H_ #define _FASTDDS_RTPS_WLP_H_ -#include #include +#include + #include +#include #include -#include namespace eprosima { namespace fastrtps { diff --git a/test/mock/rtps/WriterHistory/fastdds/rtps/history/WriterHistory.h b/test/mock/rtps/WriterHistory/fastdds/rtps/history/WriterHistory.h index fa0aaecd4b7..4bd113b7f90 100644 --- a/test/mock/rtps/WriterHistory/fastdds/rtps/history/WriterHistory.h +++ b/test/mock/rtps/WriterHistory/fastdds/rtps/history/WriterHistory.h @@ -21,13 +21,13 @@ #include -#include -#include -#include -#include - #include +#include +#include +#include +#include + namespace eprosima { namespace fastrtps { namespace rtps { diff --git a/test/mock/rtps/WriterProxyData/fastdds/rtps/builtin/data/WriterProxyData.h b/test/mock/rtps/WriterProxyData/fastdds/rtps/builtin/data/WriterProxyData.h index 267f2e2f8e4..ecdf31dd9b3 100644 --- a/test/mock/rtps/WriterProxyData/fastdds/rtps/builtin/data/WriterProxyData.h +++ b/test/mock/rtps/WriterProxyData/fastdds/rtps/builtin/data/WriterProxyData.h @@ -19,17 +19,19 @@ #ifndef _FASTDDS_RTPS_BUILTIN_DATA_WRITERPROXYDATA_H_ #define _FASTDDS_RTPS_BUILTIN_DATA_WRITERPROXYDATA_H_ -#include -#include -#include -#include +#include + +#include +#include +#include +#include +#include +#include #if HAVE_SECURITY -#include +#include #endif // if HAVE_SECURITY -#include - namespace eprosima { namespace fastrtps { namespace rtps { @@ -200,17 +202,17 @@ class WriterProxyData } void type_id( - const TypeIdV1& other_type_id) + const fastdds::dds::TypeIdV1& other_type_id) { type_id_ = other_type_id; } - const TypeIdV1& type_id() const + const fastdds::dds::TypeIdV1& type_id() const { return type_id_; } - TypeIdV1& type_id() + fastdds::dds::TypeIdV1& type_id() { return type_id_; } @@ -221,17 +223,17 @@ class WriterProxyData } void type( - const TypeObjectV1& other_type) + const fastdds::dds::TypeObjectV1& other_type) { type_ = other_type; } - const TypeObjectV1& type() const + const fastdds::dds::TypeObjectV1& type() const { return type_; } - TypeObjectV1& type() + fastdds::dds::TypeObjectV1& type() { return type_; } @@ -242,17 +244,17 @@ class WriterProxyData } void type_information( - const xtypes::TypeInformation& other_type_info) + const fastdds::dds::xtypes::TypeInformation& other_type_info) { type_info_ = other_type_info; } - const xtypes::TypeInformation& type_information() const + const fastdds::dds::xtypes::TypeInformation& type_information() const { return type_info_; } - xtypes::TypeInformation& type_information() + fastdds::dds::xtypes::TypeInformation& type_information() { return type_info_; } @@ -350,7 +352,7 @@ class WriterProxyData security::PluginEndpointSecurityAttributesMask plugin_security_attributes_ = 0UL; #endif // if HAVE_SECURITY - WriterQos m_qos; + fastdds::dds::WriterQos m_qos; private: @@ -360,9 +362,9 @@ class WriterProxyData string_255 type_name_; TopicKind_t topic_kind_; bool is_alive_; - TypeIdV1 type_id_; - TypeObjectV1 type_; - xtypes::TypeInformation type_info_; + fastdds::dds::TypeIdV1 type_id_; + fastdds::dds::TypeObjectV1 type_; + fastdds::dds::xtypes::TypeInformation type_info_; uint32_t m_typeMaxSerialized; InstanceHandle_t m_key; InstanceHandle_t m_RTPSParticipantKey; diff --git a/test/performance/CMakeLists.txt b/test/performance/CMakeLists.txt index bb6dec1e391..42098999275 100644 --- a/test/performance/CMakeLists.txt +++ b/test/performance/CMakeLists.txt @@ -26,5 +26,6 @@ option(VIDEO_TESTS "Activate the building and execution of performance tests" OF add_subdirectory(latency) add_subdirectory(throughput) if(VIDEO_TESTS) - add_subdirectory(video) +# // TODO(jlbueno): migrate to Fast DDS API +# add_subdirectory(video) endif() diff --git a/test/performance/latency/CMakeLists.txt b/test/performance/latency/CMakeLists.txt index 58108782d3b..fe693371e86 100644 --- a/test/performance/latency/CMakeLists.txt +++ b/test/performance/latency/CMakeLists.txt @@ -34,7 +34,7 @@ target_include_directories(LatencyTest PRIVATE ${Asio_INCLUDE_DIR}) target_link_libraries( LatencyTest - fastrtps + fastdds fastcdr foonathan_memory fastdds::optionparser diff --git a/test/performance/latency/LatencyTestPublisher.cpp b/test/performance/latency/LatencyTestPublisher.cpp index 45cac09b1eb..a4702334dc7 100644 --- a/test/performance/latency/LatencyTestPublisher.cpp +++ b/test/performance/latency/LatencyTestPublisher.cpp @@ -269,7 +269,7 @@ bool LatencyTestPublisher::init( ReliabilityQosPolicy rp; if (reliable) { - rp.kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + rp.kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; RTPSReliableWriterQos rw_qos; rw_qos.times.heartbeatPeriod.seconds = 0; @@ -278,7 +278,7 @@ bool LatencyTestPublisher::init( } else { - rp.kind = eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS; + rp.kind = eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS; } dw_qos_.reliability(rp); diff --git a/test/performance/latency/LatencyTestPublisher.hpp b/test/performance/latency/LatencyTestPublisher.hpp index 9d68cac2ee0..efd327eb0b3 100644 --- a/test/performance/latency/LatencyTestPublisher.hpp +++ b/test/performance/latency/LatencyTestPublisher.hpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -175,7 +176,7 @@ class LatencyTestPublisher std::vector> times_; /* Data */ - eprosima::fastrtps::SampleInfo_t sampleinfo_; + eprosima::fastdds::dds::SampleInfo sampleinfo_; std::vector stats_; uint64_t raw_sample_count_ = 0; diff --git a/test/performance/latency/LatencyTestSubscriber.cpp b/test/performance/latency/LatencyTestSubscriber.cpp index f6e34bca42a..04dec847aed 100644 --- a/test/performance/latency/LatencyTestSubscriber.cpp +++ b/test/performance/latency/LatencyTestSubscriber.cpp @@ -220,7 +220,7 @@ bool LatencyTestSubscriber::init( ReliabilityQosPolicy rp; if (reliable) { - rp.kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + rp.kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; RTPSReliableWriterQos rw_qos; rw_qos.times.heartbeatPeriod.seconds = 0; @@ -229,7 +229,7 @@ bool LatencyTestSubscriber::init( } else { - rp.kind = eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS; + rp.kind = eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS; } dr_qos_.reliability(rp); diff --git a/test/performance/latency/README.md b/test/performance/latency/README.md index aa1c23849ec..c8b3a6fef72 100644 --- a/test/performance/latency/README.md +++ b/test/performance/latency/README.md @@ -62,7 +62,7 @@ colcon build --cmake-args -DPERFORMANCE_TESTS=ON The latency test executable can be found in the `build` directory. ``` -build/fastrtps/test/performance/latency +build/fastdds/test/performance/latency ├── CMakeFiles ├── cmake_install.cmake ├── CTestTestfile.cmake @@ -97,9 +97,9 @@ The utility offers several options: | --samples= | Number of samples sent in the test. Default is *10000 samples* | | --domain \ | Set the DDS domain to be used. Default domain is a random one. If testing in separate processes, always set the domain using this argument | | --file= | File to read the payload demands. | -| --data_sharing=[on/off] | Explicitly enable/disable Data Sharing feature. Fast-DDS default is *auto* | +| --data_sharing=[on/off] | Explicitly enable/disable Data Sharing feature. Fast DDS default is *auto* | | --data_load | Enables the use of Data Loans feature | -| --shared_memory | Explicitly enable/disable Shared Memory transport. Fast-DDS default is *on* | +| --shared_memory | Explicitly enable/disable Shared Memory transport. Fast DDS default is *on* | | --security=[true/false] | Enable/disable DDS security | | --certs=\ | Directory with the certificates. Used when security is enable | @@ -153,10 +153,10 @@ The directory also comes with a Python script which automates the execution of t ```batch # Indicate where is the utility executable -export LATENCY_TEST_BIN=build/fastrtps/test/performance/latency/LatencyTest +export LATENCY_TEST_BIN=build/fastdds/test/performance/latency/LatencyTest # Call python script to run tests. -python3 src/fastrtps/test/performance/latency/latency_tests.py +python3 src/fastdds/test/performance/latency/latency_tests.py ``` The python scripts offers several options: @@ -165,7 +165,7 @@ The python scripts offers several options: | - | - | | --reliability | Set the Reliability QoS of the DDS entities to reliable. Default Reliability is best-effort | | --data_loans | Enable the use of the loan sample API. Default is disable | -| --shared_memory [on/off] | Explicitly enable/disable shared memory transport. Fast-DDS default is *on* | +| --shared_memory [on/off] | Explicitly enable/disable shared memory transport. Fast DDS default is *on* | | --interprocess | Publisher and subscriber in separate processes. Default is both in the sample process and using intraprocess communications | | --security | Enable security. Default disable | | -n \ | Number of samples sent in the test. Default is *10000 samples* diff --git a/test/performance/latency/latency_tests.py b/test/performance/latency/latency_tests.py index 1a5e5ac1646..06b906e2f76 100644 --- a/test/performance/latency/latency_tests.py +++ b/test/performance/latency/latency_tests.py @@ -23,7 +23,7 @@ parser.add_argument( '-x', '--xml_file', - help='A Fast-RTPS XML configuration file', + help='A Fast DDS XML configuration file', required=False ) parser.add_argument( @@ -58,7 +58,7 @@ '-d', '--data_sharing', choices=['on', 'off'], - help='Explicitly enable/disable data sharing. (Defaults: Fast-DDS default settings)', + help='Explicitly enable/disable data sharing. (Defaults: Fast DDS default settings)', required=False ) parser.add_argument( @@ -78,7 +78,7 @@ parser.add_argument( '--shared_memory', choices=['on', 'off'], - help='Explicitly enable/disable shared memory transport. (Defaults: Fast-DDS default settings)', + help='Explicitly enable/disable shared memory transport. (Defaults: Fast DDS default settings)', required=False ) diff --git a/test/performance/latency/main_LatencyTest.cpp b/test/performance/latency/main_LatencyTest.cpp index a7131c491c9..a1aa3f298ba 100644 --- a/test/performance/latency/main_LatencyTest.cpp +++ b/test/performance/latency/main_LatencyTest.cpp @@ -12,24 +12,23 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "LatencyTestPublisher.hpp" -#include "LatencyTestSubscriber.hpp" -#include "../optionarg.hpp" - -#include -#include -#include -#include #include #include +#include #include +#include +#include +#include -#include #include -#include +#include #include #include +#include "../optionarg.hpp" +#include "LatencyTestPublisher.hpp" +#include "LatencyTestSubscriber.hpp" + #if defined(_MSC_VER) #pragma warning (push) #pragma warning (disable:4512) diff --git a/test/performance/latency/xml/latency_interprocess_best_effort_shm_profile.xml b/test/performance/latency/xml/latency_interprocess_best_effort_shm_profile.xml index 77a20c00cab..a4495b3cb50 100644 --- a/test/performance/latency/xml/latency_interprocess_best_effort_shm_profile.xml +++ b/test/performance/latency/xml/latency_interprocess_best_effort_shm_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/latency/xml/latency_interprocess_best_effort_tcp_profile.xml b/test/performance/latency/xml/latency_interprocess_best_effort_tcp_profile.xml index a1c1034ac3f..a5e7c693e05 100644 --- a/test/performance/latency/xml/latency_interprocess_best_effort_tcp_profile.xml +++ b/test/performance/latency/xml/latency_interprocess_best_effort_tcp_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/latency/xml/latency_interprocess_best_effort_udp_profile.xml b/test/performance/latency/xml/latency_interprocess_best_effort_udp_profile.xml index a12534f93e9..f5c79a0deed 100644 --- a/test/performance/latency/xml/latency_interprocess_best_effort_udp_profile.xml +++ b/test/performance/latency/xml/latency_interprocess_best_effort_udp_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/latency/xml/latency_interprocess_reliable_shm_profile.xml b/test/performance/latency/xml/latency_interprocess_reliable_shm_profile.xml index e69f7eb1b54..a0be5e11182 100644 --- a/test/performance/latency/xml/latency_interprocess_reliable_shm_profile.xml +++ b/test/performance/latency/xml/latency_interprocess_reliable_shm_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/latency/xml/latency_interprocess_reliable_tcp_profile.xml b/test/performance/latency/xml/latency_interprocess_reliable_tcp_profile.xml index dd734a48dfc..e13bd704149 100644 --- a/test/performance/latency/xml/latency_interprocess_reliable_tcp_profile.xml +++ b/test/performance/latency/xml/latency_interprocess_reliable_tcp_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/latency/xml/latency_interprocess_reliable_udp_profile.xml b/test/performance/latency/xml/latency_interprocess_reliable_udp_profile.xml index b5446072dfb..c81ed2b82ec 100644 --- a/test/performance/latency/xml/latency_interprocess_reliable_udp_profile.xml +++ b/test/performance/latency/xml/latency_interprocess_reliable_udp_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/latency/xml/latency_intraprocess_best_effort_profile.xml b/test/performance/latency/xml/latency_intraprocess_best_effort_profile.xml index 14994632d77..69a2a43b9cf 100644 --- a/test/performance/latency/xml/latency_intraprocess_best_effort_profile.xml +++ b/test/performance/latency/xml/latency_intraprocess_best_effort_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/latency/xml/latency_intraprocess_reliable_profile.xml b/test/performance/latency/xml/latency_intraprocess_reliable_profile.xml index 63dea13e838..322f257c6c4 100644 --- a/test/performance/latency/xml/latency_intraprocess_reliable_profile.xml +++ b/test/performance/latency/xml/latency_intraprocess_reliable_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/throughput/CMakeLists.txt b/test/performance/throughput/CMakeLists.txt index 30cb02437d5..1949c2787e9 100644 --- a/test/performance/throughput/CMakeLists.txt +++ b/test/performance/throughput/CMakeLists.txt @@ -34,7 +34,7 @@ target_include_directories(ThroughputTest PRIVATE ${Asio_INCLUDE_DIR}) target_link_libraries( ThroughputTest - fastrtps + fastdds fastcdr foonathan_memory fastdds::optionparser diff --git a/test/performance/throughput/README.md b/test/performance/throughput/README.md index 1a11f020c30..e4d4c77f418 100644 --- a/test/performance/throughput/README.md +++ b/test/performance/throughput/README.md @@ -56,7 +56,7 @@ The columns show the next information: This utility can be enabled by using the CMake option `PERFORMANCE_TESTS`. Following the Fast DDS [*Installation from sources* guide](https://fast-dds.docs.eprosima.com/en/latest/installation/sources/sources_linux.html), - Fast-DDS and this utility can be compiled executing the next command. + Fast DDS and this utility can be compiled executing the next command. ``` colcon build --cmake-args -DPERFORMANCE_TESTS=ON @@ -65,7 +65,7 @@ colcon build --cmake-args -DPERFORMANCE_TESTS=ON The throughput test executable can be found in the `build` directory. ``` -build/fastrtps/test/performance/throughput +build/fastdds/test/performance/throughput ├── CMakeFiles ├── cmake_install.cmake ├── CTestTestfile.cmake @@ -98,9 +98,9 @@ The utility offers several options: | - | - | | --reliability=[reliable/besteffort] | Set the Reliability QoS of the DDS entity | | --domain \ | Set the DDS domain to be used. Default domain is a random one. If testing in separate processes, always set the domain using this argument | -| --data_sharing=[on/off] | Explicitly enable/disable Data Sharing feature. Fast-DDS default is *auto* | +| --data_sharing=[on/off] | Explicitly enable/disable Data Sharing feature. Fast DDS default is *auto* | | --data_load | Enables the use of Data Loans feature | -| --shared_memory | Explicitly enable/disable Shared Memory transport. Fast-DDS default is *on* | +| --shared_memory | Explicitly enable/disable Shared Memory transport. Fast DDS default is *on* | | --security=[true/false] | Enable/disable DDS security | | --certs=\ | Directory with the certificates. Used when security is enable | @@ -167,10 +167,10 @@ The directory also comes with a Python script which automates the execution of t ```batch # Indicate where is the utility executable -export THROUGHPUT_TEST_BIN=build/fastrtps/test/performance/throughtput/ThroughputTest +export THROUGHPUT_TEST_BIN=build/fastdds/test/performance/throughtput/ThroughputTest # Call python script to run tests. -python3 src/fastrtps/test/performance/throughput/throughput_tests.py +python3 src/fastdds/test/performance/throughput/throughput_tests.py ``` The python scripts offers several options: @@ -179,7 +179,7 @@ The python scripts offers several options: | - | - | | --reliability | Set the Reliability QoS of the DDS entities to reliable. Default Reliability is best-effort | | --data_loans | Enable the use of the loan sample API. Default is disable | -| --shared_memory [on/off] | Explicitly enable/disable shared memory transport. Fast-DDS default is *on* | +| --shared_memory [on/off] | Explicitly enable/disable shared memory transport. Fast DDS default is *on* | | --interprocess | Publisher and subscriber in separate processes. Default is both in the sample process and using intraprocess communications | | --security | Enable security. Default disable | | -t \ | Test time in seconds. Default is *1 second* | diff --git a/test/performance/throughput/ThroughputPublisher.cpp b/test/performance/throughput/ThroughputPublisher.cpp index 3e5a668d6cf..745648f3c03 100644 --- a/test/performance/throughput/ThroughputPublisher.cpp +++ b/test/performance/throughput/ThroughputPublisher.cpp @@ -252,7 +252,7 @@ bool ThroughputPublisher::init( ReliabilityQosPolicy rp; if (reliable_) { - rp.kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + rp.kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; dw_qos_.reliability(rp); RTPSReliableWriterQos rw_qos; @@ -265,7 +265,7 @@ bool ThroughputPublisher::init( } else { - rp.kind = eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS; + rp.kind = eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS; dw_qos_.reliability(rp); } diff --git a/test/performance/throughput/ThroughputPublisher.hpp b/test/performance/throughput/ThroughputPublisher.hpp index d9cd89f48b3..9ce65eeaeb6 100644 --- a/test/performance/throughput/ThroughputPublisher.hpp +++ b/test/performance/throughput/ThroughputPublisher.hpp @@ -34,20 +34,20 @@ #include #include #include +#include #include -#include -#include +#include #include +#include +#include #include +#include #include -#include #include -#include -#include -#include -#include "ThroughputTypes.hpp" +#include #include "../optionarg.hpp" +#include "ThroughputTypes.hpp" class ThroughputPublisher { diff --git a/test/performance/throughput/ThroughputSubscriber.cpp b/test/performance/throughput/ThroughputSubscriber.cpp index b0532bee28c..66cc3e55137 100644 --- a/test/performance/throughput/ThroughputSubscriber.cpp +++ b/test/performance/throughput/ThroughputSubscriber.cpp @@ -390,7 +390,9 @@ bool ThroughputSubscriber::init( // Reliability ReliabilityQosPolicy rp; - rp.kind = reliable_ ? eprosima::fastrtps::RELIABLE_RELIABILITY_QOS: eprosima::fastrtps::BEST_EFFORT_RELIABILITY_QOS; + rp.kind = + reliable_ ? eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS: eprosima::fastdds::dds:: + BEST_EFFORT_RELIABILITY_QOS; dr_qos_.reliability(rp); // Set data sharing according with cli. Is disabled by default in all xml profiles diff --git a/test/performance/throughput/ThroughputSubscriber.hpp b/test/performance/throughput/ThroughputSubscriber.hpp index 0587873fde3..dbe07747b80 100644 --- a/test/performance/throughput/ThroughputSubscriber.hpp +++ b/test/performance/throughput/ThroughputSubscriber.hpp @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include #include #include @@ -42,9 +42,9 @@ #include #include #include -#include "ThroughputTypes.hpp" #include "../optionarg.hpp" +#include "ThroughputTypes.hpp" class ThroughputSubscriber { diff --git a/test/performance/throughput/ThroughputTypes.hpp b/test/performance/throughput/ThroughputTypes.hpp index dc5f48efc59..cf4b4b8c48c 100644 --- a/test/performance/throughput/ThroughputTypes.hpp +++ b/test/performance/throughput/ThroughputTypes.hpp @@ -20,12 +20,12 @@ #ifndef THROUGHPUTTYPES_H_ #define THROUGHPUTTYPES_H_ -#include -#include -#include - #include +#include +#include +#include + struct TroughputResults { uint32_t payload_size; @@ -113,7 +113,7 @@ typedef struct alignas(4) ThroughputType } ThroughputType; -class ThroughputDataType : public eprosima::fastrtps::TopicDataType +class ThroughputDataType : public eprosima::fastdds::dds::TopicDataType { // Buffer size for the manage type const uint32_t buffer_size_; @@ -197,7 +197,7 @@ class ThroughputDataType : public eprosima::fastrtps::TopicDataType private: - using eprosima::fastrtps::TopicDataType::is_plain; + using eprosima::fastdds::dds::TopicDataType::is_plain; }; enum e_Command : uint32_t @@ -251,7 +251,7 @@ inline std::ostream& operator <<( return output; } -class ThroughputCommandDataType : public eprosima::fastrtps::TopicDataType +class ThroughputCommandDataType : public eprosima::fastdds::dds::TopicDataType { public: diff --git a/test/performance/throughput/main_ThroughputTest.cpp b/test/performance/throughput/main_ThroughputTest.cpp index 09f299a323a..a5e6871c6d8 100644 --- a/test/performance/throughput/main_ThroughputTest.cpp +++ b/test/performance/throughput/main_ThroughputTest.cpp @@ -12,22 +12,20 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "ThroughputTypes.hpp" -#include "ThroughputPublisher.hpp" -#include "ThroughputSubscriber.hpp" - -#include "../optionarg.hpp" - -#include -#include -#include #include #include +#include +#include +#include #include -#include #include +#include "../optionarg.hpp" +#include "ThroughputPublisher.hpp" +#include "ThroughputSubscriber.hpp" +#include "ThroughputTypes.hpp" + #if defined(_MSC_VER) #pragma warning (push) #pragma warning (disable:4512) diff --git a/test/performance/throughput/throughput_tests.py b/test/performance/throughput/throughput_tests.py index 57aa556116f..5c7bedbcfdb 100644 --- a/test/performance/throughput/throughput_tests.py +++ b/test/performance/throughput/throughput_tests.py @@ -24,7 +24,7 @@ parser.add_argument( '-x', '--xml_file', - help='A Fast-RTPS XML configuration file', + help='A Fast DDS XML configuration file', required=False ) parser.add_argument( @@ -66,7 +66,7 @@ '-d', '--data_sharing', choices=['on', 'off'], - help='Explicitly enable/disable data sharing. (Defaults: Fast-DDS default settings)', + help='Explicitly enable/disable data sharing. (Defaults: Fast DDS default settings)', required=False ) parser.add_argument( @@ -86,7 +86,7 @@ parser.add_argument( '--shared_memory', choices=['on', 'off'], - help='Explicitly enable/disable shared memory transport. (Defaults: Fast-DDS default settings)', + help='Explicitly enable/disable shared memory transport. (Defaults: Fast DDS default settings)', required=False ) diff --git a/test/performance/throughput/xml/throughput_interprocess_best_effort_shm_profile.xml b/test/performance/throughput/xml/throughput_interprocess_best_effort_shm_profile.xml index 938c11ba62f..c993627a446 100644 --- a/test/performance/throughput/xml/throughput_interprocess_best_effort_shm_profile.xml +++ b/test/performance/throughput/xml/throughput_interprocess_best_effort_shm_profile.xml @@ -1,5 +1,5 @@ - + OFF diff --git a/test/performance/throughput/xml/throughput_interprocess_best_effort_tcp_profile.xml b/test/performance/throughput/xml/throughput_interprocess_best_effort_tcp_profile.xml index 7308c76a146..8c50c9099e2 100644 --- a/test/performance/throughput/xml/throughput_interprocess_best_effort_tcp_profile.xml +++ b/test/performance/throughput/xml/throughput_interprocess_best_effort_tcp_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/throughput/xml/throughput_interprocess_best_effort_udp_profile.xml b/test/performance/throughput/xml/throughput_interprocess_best_effort_udp_profile.xml index e46c159d5d7..b19956384d9 100644 --- a/test/performance/throughput/xml/throughput_interprocess_best_effort_udp_profile.xml +++ b/test/performance/throughput/xml/throughput_interprocess_best_effort_udp_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/throughput/xml/throughput_interprocess_reliable_shm_profile.xml b/test/performance/throughput/xml/throughput_interprocess_reliable_shm_profile.xml index 413dffada21..81c077bd6d0 100644 --- a/test/performance/throughput/xml/throughput_interprocess_reliable_shm_profile.xml +++ b/test/performance/throughput/xml/throughput_interprocess_reliable_shm_profile.xml @@ -1,5 +1,5 @@ - + OFF diff --git a/test/performance/throughput/xml/throughput_interprocess_reliable_tcp_profile.xml b/test/performance/throughput/xml/throughput_interprocess_reliable_tcp_profile.xml index 4b4dbbc5e9e..00d0c59ecdc 100644 --- a/test/performance/throughput/xml/throughput_interprocess_reliable_tcp_profile.xml +++ b/test/performance/throughput/xml/throughput_interprocess_reliable_tcp_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/throughput/xml/throughput_interprocess_reliable_udp_profile.xml b/test/performance/throughput/xml/throughput_interprocess_reliable_udp_profile.xml index 64205fa54be..0709c1b2647 100644 --- a/test/performance/throughput/xml/throughput_interprocess_reliable_udp_profile.xml +++ b/test/performance/throughput/xml/throughput_interprocess_reliable_udp_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/throughput/xml/throughput_intraprocess_best_effort_profile.xml b/test/performance/throughput/xml/throughput_intraprocess_best_effort_profile.xml index 34b75392443..4459532b0c7 100644 --- a/test/performance/throughput/xml/throughput_intraprocess_best_effort_profile.xml +++ b/test/performance/throughput/xml/throughput_intraprocess_best_effort_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/throughput/xml/throughput_intraprocess_reliable_profile.xml b/test/performance/throughput/xml/throughput_intraprocess_reliable_profile.xml index 1b9df41a54d..0e371fde075 100644 --- a/test/performance/throughput/xml/throughput_intraprocess_reliable_profile.xml +++ b/test/performance/throughput/xml/throughput_intraprocess_reliable_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/video/CMakeLists.txt b/test/performance/video/CMakeLists.txt index 186df42e449..b0c54506756 100644 --- a/test/performance/video/CMakeLists.txt +++ b/test/performance/video/CMakeLists.txt @@ -108,7 +108,7 @@ if(GST_FOUND) if (WIN32) target_link_libraries( VideoTest - fastrtps + fastdds fastcdr foonathan_memory fastdds::optionparser @@ -125,7 +125,7 @@ if(GST_FOUND) else() target_link_libraries( VideoTest - fastrtps + fastdds fastcdr foonathan_memory fastdds::optionparser diff --git a/test/performance/video/VideoTestPublisher.cpp b/test/performance/video/VideoTestPublisher.cpp index 7f2456e7252..cc90cf43cab 100644 --- a/test/performance/video/VideoTestPublisher.cpp +++ b/test/performance/video/VideoTestPublisher.cpp @@ -23,10 +23,9 @@ #include #include -#include #include #include -#include +#include #include #include @@ -216,6 +215,22 @@ void VideoTestPublisher::init( // Create Data Publisher std::string profile_name = "publisher_profile"; +<<<<<<< HEAD +======= + PublisherAttributes PubDataparam; + + if (!reliable) + { + PubDataparam.qos.m_reliability.kind = BEST_EFFORT_RELIABILITY_QOS; + } + PubDataparam.properties = property_policy; + if (large_data) + { + PubDataparam.historyMemoryPolicy = eprosima::fastrtps::rtps::PREALLOCATED_WITH_REALLOC_MEMORY_MODE; + PubDataparam.qos.m_publishMode.kind = + eprosima::fastdds::dds::PublishModeQosPolicyKind::ASYNCHRONOUS_PUBLISH_MODE; + } +>>>>>>> 021566dac (Branch-out v3.0.0 (#4251)) if (m_sXMLConfigFile.length() > 0) { @@ -277,7 +292,17 @@ void VideoTestPublisher::init( { command_topic_name << asio::ip::host_name() << "_"; } +<<<<<<< HEAD command_topic_name << pid << "_PUB2SUB"; +======= + pct << pid << "_PUB2SUB"; + PubCommandParam.topic.topicName = pct.str(); + PubCommandParam.topic.historyQos.kind = KEEP_ALL_HISTORY_QOS; + PubCommandParam.qos.m_reliability.kind = RELIABLE_RELIABILITY_QOS; + PubCommandParam.qos.m_durability.kind = TRANSIENT_LOCAL_DURABILITY_QOS; + PubCommandParam.qos.m_publishMode.kind = eprosima::fastdds::dds::PublishModeQosPolicyKind::SYNCHRONOUS_PUBLISH_MODE; + mp_commandpub = Domain::createPublisher(mp_participant, PubCommandParam, &this->m_commandpublistener); +>>>>>>> 021566dac (Branch-out v3.0.0 (#4251)) mp_command_pub_topic = mp_participant->create_topic(command_topic_name.str(), "TestCommandType", TOPIC_QOS_DEFAULT); diff --git a/test/performance/video/VideoTestSubscriber.cpp b/test/performance/video/VideoTestSubscriber.cpp index 59762423270..744a53ae3b5 100644 --- a/test/performance/video/VideoTestSubscriber.cpp +++ b/test/performance/video/VideoTestSubscriber.cpp @@ -23,8 +23,8 @@ #include #include +#include #include -#include #include #include diff --git a/test/performance/video/main_VideoTest.cpp b/test/performance/video/main_VideoTest.cpp index b09069dee7b..0cc360b7346 100644 --- a/test/performance/video/main_VideoTest.cpp +++ b/test/performance/video/main_VideoTest.cpp @@ -20,14 +20,11 @@ #include #include -#include - -#include - #include -#include #include #include +#include +#include #include "VideoTestPublisher.hpp" #include "VideoTestSubscriber.hpp" diff --git a/test/performance/video/video_tests.py b/test/performance/video/video_tests.py index 6f49bb1b825..3d650306cb6 100644 --- a/test/performance/video/video_tests.py +++ b/test/performance/video/video_tests.py @@ -46,7 +46,7 @@ def assert_positive_int(str_number, str_name): parser.add_argument( '-x', '--xml_file', - help='A Fast-RTPS XML configuration file', + help='A Fast DDS XML configuration file', required=False ) parser.add_argument( diff --git a/test/performance/video/xml/video_interprocess_best_effort_profile.xml b/test/performance/video/xml/video_interprocess_best_effort_profile.xml index 8226f0e0667..6f9bcdc17b7 100644 --- a/test/performance/video/xml/video_interprocess_best_effort_profile.xml +++ b/test/performance/video/xml/video_interprocess_best_effort_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/video/xml/video_interprocess_best_effort_tcp_profile.xml b/test/performance/video/xml/video_interprocess_best_effort_tcp_profile.xml index ec1afc9dd00..021cf3fd857 100644 --- a/test/performance/video/xml/video_interprocess_best_effort_tcp_profile.xml +++ b/test/performance/video/xml/video_interprocess_best_effort_tcp_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/video/xml/video_interprocess_reliable_profile.xml b/test/performance/video/xml/video_interprocess_reliable_profile.xml index 9abaf6b101d..f325680610a 100644 --- a/test/performance/video/xml/video_interprocess_reliable_profile.xml +++ b/test/performance/video/xml/video_interprocess_reliable_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/performance/video/xml/video_interprocess_reliable_tcp_profile.xml b/test/performance/video/xml/video_interprocess_reliable_tcp_profile.xml index bc1e06eaef7..96ea087ca0c 100644 --- a/test/performance/video/xml/video_interprocess_reliable_tcp_profile.xml +++ b/test/performance/video/xml/video_interprocess_reliable_tcp_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/profiling/CMakeLists.txt b/test/profiling/CMakeLists.txt index 71a4092718d..d97b21d043f 100644 --- a/test/profiling/CMakeLists.txt +++ b/test/profiling/CMakeLists.txt @@ -42,7 +42,7 @@ set(MEMORYTEST_SOURCE MemoryTestPublisher.cpp ) add_executable(MemoryTest ${MEMORYTEST_SOURCE}) target_include_directories(MemoryTest PRIVATE ${Asio_INCLUDE_DIR}) -target_link_libraries(MemoryTest fastrtps foonathan_memory fastdds::optionparser ${CMAKE_THREAD_LIBS_INIT} ${CMAKE_DL_LIBS}) +target_link_libraries(MemoryTest fastdds foonathan_memory fastdds::optionparser ${CMAKE_THREAD_LIBS_INIT} ${CMAKE_DL_LIBS}) configure_file("cycles_tests.py" "cycles_tests.py") configure_file("memory_tests.py" "memory_tests.py") diff --git a/test/profiling/MemoryTestPublisher.cpp b/test/profiling/MemoryTestPublisher.cpp index 91b04e6dc60..eb31bdb9118 100644 --- a/test/profiling/MemoryTestPublisher.cpp +++ b/test/profiling/MemoryTestPublisher.cpp @@ -26,8 +26,8 @@ #include #include +#include #include -#include #ifndef _WIN32 #define localtime_s(X, Y) localtime_r(Y, X) @@ -166,7 +166,8 @@ bool MemoryTestPublisher::init( if (m_data_size > 60000) { PubDataparam.historyMemoryPolicy = eprosima::fastrtps::rtps::PREALLOCATED_WITH_REALLOC_MEMORY_MODE; - PubDataparam.qos.m_publishMode.kind = eprosima::fastrtps::ASYNCHRONOUS_PUBLISH_MODE; + PubDataparam.qos.m_publishMode.kind = + eprosima::fastdds::dds::PublishModeQosPolicyKind::ASYNCHRONOUS_PUBLISH_MODE; } if (m_sXMLConfigFile.length() > 0) @@ -201,7 +202,7 @@ bool MemoryTestPublisher::init( PubCommandParam.topic.historyQos.kind = KEEP_ALL_HISTORY_QOS; PubCommandParam.qos.m_durability.kind = TRANSIENT_LOCAL_DURABILITY_QOS; PubCommandParam.qos.m_reliability.kind = RELIABLE_RELIABILITY_QOS; - PubCommandParam.qos.m_publishMode.kind = eprosima::fastrtps::SYNCHRONOUS_PUBLISH_MODE; + PubCommandParam.qos.m_publishMode.kind = eprosima::fastdds::dds::PublishModeQosPolicyKind::SYNCHRONOUS_PUBLISH_MODE; mp_commandpub = Domain::createPublisher(mp_participant, PubCommandParam, &this->m_commandpublistener); diff --git a/test/profiling/MemoryTestSubscriber.cpp b/test/profiling/MemoryTestSubscriber.cpp index ac533d408f3..839e66ee2d9 100644 --- a/test/profiling/MemoryTestSubscriber.cpp +++ b/test/profiling/MemoryTestSubscriber.cpp @@ -22,8 +22,8 @@ #include #include +#include #include -#include using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; @@ -180,7 +180,7 @@ bool MemoryTestSubscriber::init( PubCommandParam.topic.historyQos.kind = KEEP_ALL_HISTORY_QOS; PubCommandParam.qos.m_durability.kind = TRANSIENT_LOCAL_DURABILITY_QOS; PubCommandParam.qos.m_reliability.kind = RELIABLE_RELIABILITY_QOS; - PubCommandParam.qos.m_publishMode.kind = eprosima::fastrtps::SYNCHRONOUS_PUBLISH_MODE; + PubCommandParam.qos.m_publishMode.kind = eprosima::fastdds::dds::PublishModeQosPolicyKind::SYNCHRONOUS_PUBLISH_MODE; mp_commandpub = Domain::createPublisher(mp_participant, PubCommandParam, &this->m_commandpublistener); diff --git a/test/profiling/MemoryTestTypes.h b/test/profiling/MemoryTestTypes.h index 6c4155f34fa..c980a735cb1 100644 --- a/test/profiling/MemoryTestTypes.h +++ b/test/profiling/MemoryTestTypes.h @@ -24,56 +24,91 @@ class MemoryType { - public: +public: - uint32_t seqnum; - std::vector data; + uint32_t seqnum; + std::vector data; - MemoryType(): seqnum(0) {} + MemoryType() + : seqnum(0) + { + } - MemoryType(uint32_t number) : - seqnum(0), data(number,0) {} + MemoryType( + uint32_t number) + : seqnum(0) + , data(number, 0) + { + } + + ~MemoryType() + { + } - ~MemoryType() {} }; -inline bool operator==(const MemoryType& lt1, const MemoryType& lt2) +inline bool operator ==( + const MemoryType& lt1, + const MemoryType& lt2) { - if(lt1.seqnum!=lt2.seqnum) + if (lt1.seqnum != lt2.seqnum) + { return false; - if(lt1.data.size()!=lt2.data.size()) + } + if (lt1.data.size() != lt2.data.size()) + { return false; - for(size_t i = 0;i getSerializedSizeProvider(void* data); - void* createData(); - void deleteData(void* data); - bool getKey(void* /*data*/, eprosima::fastrtps::rtps::InstanceHandle_t* /*ihandle*/, bool force_md5 = false) override { - (void)force_md5; - return false; - } +public: + + MemoryDataType() + { + setName("MemoryType"); + m_typeSize = 17000; + m_isGetKeyDefined = false; + } + + ~MemoryDataType() + { + } + + bool serialize( + void* data, + eprosima::fastrtps::rtps::SerializedPayload_t* payload); + bool deserialize( + eprosima::fastrtps::rtps::SerializedPayload_t* payload, + void* data); + std::function getSerializedSizeProvider( + void* data); + void* createData(); + void deleteData( + void* data); + bool getKey( + void* /*data*/, + eprosima::fastrtps::rtps::InstanceHandle_t* /*ihandle*/, + bool force_md5 = false) override + { + (void)force_md5; + return false; + } + }; -enum TESTCOMMAND:uint32_t{ +enum TESTCOMMAND : uint32_t +{ DEFAULT, READY, BEGIN, @@ -84,31 +119,54 @@ enum TESTCOMMAND:uint32_t{ typedef struct TestCommandType { TESTCOMMAND m_command; - TestCommandType(){ + TestCommandType() + { m_command = DEFAULT; } - TestCommandType(TESTCOMMAND com):m_command(com){} + + TestCommandType( + TESTCOMMAND com) + : m_command(com) + { + } + }TestCommandType; -class TestCommandDataType : public eprosima::fastrtps::TopicDataType +class TestCommandDataType : public eprosima::fastdds::dds::TopicDataType { - public: - TestCommandDataType() - { - setName("TestCommandType"); - m_typeSize = 4; - m_isGetKeyDefined = false; - }; - ~TestCommandDataType(){}; - bool serialize(void*data,eprosima::fastrtps::rtps::SerializedPayload_t* payload); - bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t* payload,void * data); - std::function getSerializedSizeProvider(void* data); - void* createData(); - void deleteData(void* data); - bool getKey(void* /*data*/, eprosima::fastrtps::rtps::InstanceHandle_t* /*ihandle*/, bool force_md5 = false) override { - (void)force_md5; - return false; - } +public: + + TestCommandDataType() + { + setName("TestCommandType"); + m_typeSize = 4; + m_isGetKeyDefined = false; + } + + ~TestCommandDataType() + { + } + + bool serialize( + void* data, + eprosima::fastrtps::rtps::SerializedPayload_t* payload); + bool deserialize( + eprosima::fastrtps::rtps::SerializedPayload_t* payload, + void* data); + std::function getSerializedSizeProvider( + void* data); + void* createData(); + void deleteData( + void* data); + bool getKey( + void* /*data*/, + eprosima::fastrtps::rtps::InstanceHandle_t* /*ihandle*/, + bool force_md5 = false) override + { + (void)force_md5; + return false; + } + }; diff --git a/test/profiling/RTPSProfilingCommon.h b/test/profiling/RTPSProfilingCommon.h index 6eeeccddc81..5eb7d3f368d 100644 --- a/test/profiling/RTPSProfilingCommon.h +++ b/test/profiling/RTPSProfilingCommon.h @@ -1,11 +1,11 @@ -#ifndef _EPROSIMA_FASTRTPS_PROFILING_COMMON_ -#define _EPROSIMA_FASTRTPS_PROFILING_COMMON_ +#ifndef _EPROSIMA_FASTDDS_PROFILING_COMMON_ +#define _EPROSIMA_FASTDDS_PROFILING_COMMON_ #if defined(_WIN32) #define GET_PID _getpid #else #define GET_PID getpid -#endif +#endif // if defined(_WIN32) -#endif //_EPROSIMA_FASTRTPS_PROFILING_COMMON_ \ No newline at end of file +#endif //_EPROSIMA_FASTDDS_PROFILING_COMMON_ diff --git a/test/profiling/allocations/AllocTestCommon.cpp b/test/profiling/allocations/AllocTestCommon.cpp index be842d7d1c9..44935a25d18 100644 --- a/test/profiling/allocations/AllocTestCommon.cpp +++ b/test/profiling/allocations/AllocTestCommon.cpp @@ -27,8 +27,7 @@ using MemoryToolsService = osrf_testing_tools_cpp::memory_tools::MemoryToolsService; -namespace eprosima_profiling -{ +namespace eprosima_profiling { /** * Used to run callgrind with --zero-before=*callgrind_zero_count. @@ -57,28 +56,36 @@ static std::atomic_size_t g_phase(0u); static std::atomic g_allocationsPtr(g_allocations); static std::atomic g_deallocationsPtr(g_deallocations); -const std::regex is_fastrtps("fastrtps"); +const std::regex is_fastdds("fastdds"); -static void allocation_account(MemoryToolsService & service) +static void allocation_account( + MemoryToolsService& service) { // It makes no sense to track allocations if they don't come from our library auto stack = service.get_stack_trace(); - if (stack != nullptr && stack->matches_any_object_function(is_fastrtps)) + if (stack != nullptr && stack->matches_any_object_function(is_fastdds)) { (*g_allocationsPtr.load())++; - if (g_print_alloc_traces) service.print_backtrace(); + if (g_print_alloc_traces) + { + service.print_backtrace(); + } } service.ignore(); } -static void deallocation_account(MemoryToolsService & service) +static void deallocation_account( + MemoryToolsService& service) { // It makes no sense to track allocations if they don't come from our library auto stack = service.get_stack_trace(); - if (stack != nullptr && stack->matches_any_object_function(is_fastrtps)) + if (stack != nullptr && stack->matches_any_object_function(is_fastdds)) { (*g_deallocationsPtr.load())++; - if (g_print_dealloc_traces) service.print_backtrace(); + if (g_print_dealloc_traces) + { + service.print_backtrace(); + } } service.ignore(); } @@ -163,11 +170,11 @@ void print_results( const std::string& entity, const std::string& config) { - if(!g_print_results) + if (!g_print_results) { return; } - + std::string output_filename = file_prefix; if (file_prefix.length() == 0) { @@ -185,10 +192,10 @@ void print_results( if (pos == 0) { output_stream << "\"Discovery allocations\", \"Discovery deallocations\"," - << " \"First sample allocations\", \"First sample deallocations\"," - << " \"Data exchange allocations\", \"Data exchange deallocations\"," - << " \"Undiscovery allocations\", \"Undiscovery deallocations\"" - << std::endl; + << " \"First sample allocations\", \"First sample deallocations\"," + << " \"Data exchange allocations\", \"Data exchange deallocations\"," + << " \"Undiscovery allocations\", \"Undiscovery deallocations\"" + << std::endl; } for (size_t i = 0; i < 4; i++) diff --git a/test/profiling/allocations/AllocTestCommon.h b/test/profiling/allocations/AllocTestCommon.h index 0f321bae02c..85ff2a74557 100644 --- a/test/profiling/allocations/AllocTestCommon.h +++ b/test/profiling/allocations/AllocTestCommon.h @@ -17,13 +17,12 @@ * */ -#ifndef FASTRTPS_TEST_PROFILING_ALLOCATIONS_ALLOCTESTCOMMON_H_ -#define FASTRTPS_TEST_PROFILING_ALLOCATIONS_ALLOCTESTCOMMON_H_ +#ifndef FASTDDS_TEST_PROFILING_ALLOCATIONS_ALLOCTESTCOMMON_H_ +#define FASTDDS_TEST_PROFILING_ALLOCATIONS_ALLOCTESTCOMMON_H_ #include -namespace eprosima_profiling -{ +namespace eprosima_profiling { /** * Used to run callgrind with --zero-before=callgrind_zero_count. @@ -77,4 +76,4 @@ void print_results( } // namespace eprosima_profiling -#endif // FASTRTPS_TEST_PROFILING_ALLOCATIONS_ALLOCTESTCOMMON_H_ +#endif // FASTDDS_TEST_PROFILING_ALLOCATIONS_ALLOCTESTCOMMON_H_ diff --git a/test/profiling/allocations/AllocTest_main.cpp b/test/profiling/allocations/AllocTest_main.cpp index c014f69c616..a79f259dea9 100644 --- a/test/profiling/allocations/AllocTest_main.cpp +++ b/test/profiling/allocations/AllocTest_main.cpp @@ -17,30 +17,35 @@ * */ +#include + #include "AllocTestPublisher.h" #include "AllocTestSubscriber.h" -#include -#include - using namespace eprosima; using namespace fastrtps; using namespace rtps; -int main(int argc, char** argv) +int main( + int argc, + char** argv) { - std::cout << "Starting "<< std::endl; + std::cout << "Starting " << std::endl; int type = 1; int domain = 1; bool wait_unmatch = false; const char* profile = "tl_be"; std::string outputFile = ""; - if(argc > 2) + if (argc > 2) { - if(strcmp(argv[1],"publisher")==0) + if (strcmp(argv[1], "publisher") == 0) + { type = 1; - else if(strcmp(argv[1],"subscriber")==0) + } + else if (strcmp(argv[1], "subscriber") == 0) + { type = 2; + } profile = argv[2]; @@ -57,7 +62,7 @@ int main(int argc, char** argv) } else { - std::cout + std::cout << "Syntax is AllocationTestExample , where:" << std::endl << " kind:" << std::endl << " publisher OR subscriber" << std::endl @@ -71,29 +76,28 @@ int main(int argc, char** argv) } - switch(type) + switch (type) { case 1: + { + AllocTestPublisher mypub; + if (mypub.init(profile, domain, outputFile)) { - AllocTestPublisher mypub; - if(mypub.init(profile, domain, outputFile)) - { - mypub.run(60, wait_unmatch); - } - break; + mypub.run(60, wait_unmatch); } + break; + } case 2: + { + AllocTestSubscriber mysub; + if (mysub.init(profile, domain, outputFile)) { - AllocTestSubscriber mysub; - if(mysub.init(profile, domain, outputFile)) - { - mysub.run(wait_unmatch); - } - break; + mysub.run(wait_unmatch); } + break; + } } - Domain::stopAll(); eprosima::fastdds::dds::Log::Reset(); return 0; diff --git a/test/profiling/allocations/CMakeLists.txt b/test/profiling/allocations/CMakeLists.txt index 8d67649d86f..a4b3cb94f1a 100644 --- a/test/profiling/allocations/CMakeLists.txt +++ b/test/profiling/allocations/CMakeLists.txt @@ -14,7 +14,7 @@ cmake_minimum_required(VERSION 3.20) -project(fastrtps_allocation_test VERSION 1 LANGUAGES CXX) +project(fastdds_allocation_test VERSION 1 LANGUAGES CXX) # Default to C++11 if(NOT CMAKE_CXX_STANDARD) @@ -44,7 +44,7 @@ if (osrf_testing_tools_cpp_FOUND) ) add_executable(AllocationTest ${ALLOCTEST_EXAMPLE_SOURCES_CXX} ${ALLOCTEST_EXAMPLE_SOURCES_CPP}) - target_link_libraries(AllocationTest fastrtps fastcdr foonathan_memory osrf_testing_tools_cpp::memory_tools) + target_link_libraries(AllocationTest fastdds fastcdr foonathan_memory osrf_testing_tools_cpp::memory_tools) install(TARGETS AllocationTest RUNTIME DESTINATION test/profiling/allocations/${BIN_INSTALL_DIR}) else(osrf_testing_tools_cpp_FOUND) diff --git a/test/profiling/allocations/test_xml_profile.xml b/test/profiling/allocations/test_xml_profile.xml index 37cf7a98755..7a4c935c265 100644 --- a/test/profiling/allocations/test_xml_profile.xml +++ b/test/profiling/allocations/test_xml_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/system/tools/xmlvalidation/all_profile.xml b/test/system/tools/xmlvalidation/all_profile.xml index eb99327767f..1c0049748f3 100644 --- a/test/system/tools/xmlvalidation/all_profile.xml +++ b/test/system/tools/xmlvalidation/all_profile.xml @@ -1,5 +1,5 @@ - + 1 diff --git a/test/system/tools/xmlvalidation/dataReader_profile.xml b/test/system/tools/xmlvalidation/dataReader_profile.xml index c2c8ed17a84..4cbfb3dd8dc 100644 --- a/test/system/tools/xmlvalidation/dataReader_profile.xml +++ b/test/system/tools/xmlvalidation/dataReader_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/system/tools/xmlvalidation/dataWriter_profile.xml b/test/system/tools/xmlvalidation/dataWriter_profile.xml index 718dff28343..b568bc3cc77 100644 --- a/test/system/tools/xmlvalidation/dataWriter_profile.xml +++ b/test/system/tools/xmlvalidation/dataWriter_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/system/tools/xmlvalidation/domainParticipant_profile.xml b/test/system/tools/xmlvalidation/domainParticipant_profile.xml index 592fafb6143..6e3bde1393a 100644 --- a/test/system/tools/xmlvalidation/domainParticipant_profile.xml +++ b/test/system/tools/xmlvalidation/domainParticipant_profile.xml @@ -1,5 +1,5 @@ - + 11 diff --git a/test/system/tools/xmlvalidation/librarySettings_profile.xml b/test/system/tools/xmlvalidation/librarySettings_profile.xml index bf2ba8075b6..fb4c8f8d92a 100644 --- a/test/system/tools/xmlvalidation/librarySettings_profile.xml +++ b/test/system/tools/xmlvalidation/librarySettings_profile.xml @@ -1,4 +1,4 @@ - + OFF diff --git a/test/system/tools/xmlvalidation/log_profile.xml b/test/system/tools/xmlvalidation/log_profile.xml index 58a2946c0ef..266a7ebd049 100644 --- a/test/system/tools/xmlvalidation/log_profile.xml +++ b/test/system/tools/xmlvalidation/log_profile.xml @@ -1,5 +1,5 @@ - + false diff --git a/test/system/tools/xmlvalidation/topic_profile.xml b/test/system/tools/xmlvalidation/topic_profile.xml index 07281bdb35f..6ffe6a728f1 100644 --- a/test/system/tools/xmlvalidation/topic_profile.xml +++ b/test/system/tools/xmlvalidation/topic_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/system/tools/xmlvalidation/transportDescriptor_profile.xml b/test/system/tools/xmlvalidation/transportDescriptor_profile.xml index ade6ced192d..b63924ed044 100644 --- a/test/system/tools/xmlvalidation/transportDescriptor_profile.xml +++ b/test/system/tools/xmlvalidation/transportDescriptor_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/system/tools/xmlvalidation/types_profile.xml b/test/system/tools/xmlvalidation/types_profile.xml index 71efc643154..a69160f7bf3 100644 --- a/test/system/tools/xmlvalidation/types_profile.xml +++ b/test/system/tools/xmlvalidation/types_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/unittest/CMakeLists.txt b/test/unittest/CMakeLists.txt index 2eca626d922..ed3d395edd1 100644 --- a/test/unittest/CMakeLists.txt +++ b/test/unittest/CMakeLists.txt @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -add_compile_definitions(FASTRTPS_NO_LIB) +add_compile_definitions(FASTDDS_NO_LIB) add_subdirectory(rtps/attributes) add_subdirectory(rtps/common) diff --git a/test/unittest/cmake/CMakeLists.txt b/test/unittest/cmake/CMakeLists.txt index b86c7e8b30b..dddfc476798 100644 --- a/test/unittest/cmake/CMakeLists.txt +++ b/test/unittest/cmake/CMakeLists.txt @@ -16,8 +16,8 @@ # CMake modules tests ############################################################################### -set(build_dir "${fastrtps_BINARY_DIR}/test/force_cxx") -set(module_dir "${fastrtps_SOURCE_DIR}/cmake/common") +set(build_dir "${fastdds_BINARY_DIR}/test/force_cxx") +set(module_dir "${fastdds_SOURCE_DIR}/cmake/common") set(script "${CMAKE_CURRENT_LIST_DIR}/force_cxx/build.cmake") # The C++ sources use fold expressions which were introduced in C++17 diff --git a/test/unittest/common/GTestPrinters.hpp b/test/unittest/common/GTestPrinters.hpp deleted file mode 100644 index 48298803e00..00000000000 --- a/test/unittest/common/GTestPrinters.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2022 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file GTestPrinters.hpp - * - */ - -#ifndef GTESTPRINTERS_HPP -#define GTESTPRINTERS_HPP - -#include - -/** - * Workaround for GCC to behave properly and let Google Test know what to do with null_types - * when printing an ASSERT/EXPECT result. Documentation can be found here: - * https://github.com/google/googletest/blob/main/googletest/include/gtest/gtest-printers.h - * - */ -namespace dds { -namespace core { -void PrintTo( - const null_type, - std::ostream* os) -{ - *os << "::dds::core::null_type"; -} - -} // namespace core -} // namespace dds - -#endif // GTESTPRINTERS_HPP diff --git a/test/unittest/dds/core/entity/mock/MockEntity.hpp b/test/unittest/dds/core/entity/mock/MockEntity.hpp index 13fd3d98daf..15b80bf3f94 100644 --- a/test/unittest/dds/core/entity/mock/MockEntity.hpp +++ b/test/unittest/dds/core/entity/mock/MockEntity.hpp @@ -34,7 +34,7 @@ class MockEntity : public Entity }; } // namespace rtps -} // namespace fastrtps +} // namespace fastdds } // namespace eprosima #endif //MOCK_ENTITY_H diff --git a/test/unittest/dds/core/policy/CMakeLists.txt b/test/unittest/dds/core/policy/CMakeLists.txt index e638a4dcf0b..56dfe44bff1 100644 --- a/test/unittest/dds/core/policy/CMakeLists.txt +++ b/test/unittest/dds/core/policy/CMakeLists.txt @@ -20,7 +20,7 @@ set(PARAMETER_PROPERTY_LIST_TESTS ParameterPropertyList.cpp) add_executable(ParameterPropertyListTests ${PARAMETER_PROPERTY_LIST_TESTS}) -target_compile_definitions(ParameterPropertyListTests PRIVATE FASTRTPS_NO_LIB +target_compile_definitions(ParameterPropertyListTests PRIVATE FASTDDS_NO_LIB $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. ) @@ -29,6 +29,6 @@ target_include_directories(ParameterPropertyListTests PRIVATE ${PROJECT_BINARY_DIR}/include ${PROJECT_SOURCE_DIR}/src/cpp ) -target_link_libraries(ParameterPropertyListTests GTest::gtest fastcdr fastrtps) +target_link_libraries(ParameterPropertyListTests GTest::gtest fastcdr fastdds) gtest_discover_tests(ParameterPropertyListTests) diff --git a/test/unittest/dds/participant/CMakeLists.txt b/test/unittest/dds/participant/CMakeLists.txt index 9982d19b89b..d8644da7ea3 100644 --- a/test/unittest/dds/participant/CMakeLists.txt +++ b/test/unittest/dds/participant/CMakeLists.txt @@ -42,7 +42,7 @@ target_include_directories(ParticipantTests PRIVATE ${PROJECT_SOURCE_DIR}/include ${PROJECT_BINARY_DIR}/include ${PROJECT_SOURCE_DIR}/src/cpp ) -target_link_libraries(ParticipantTests fastrtps fastcdr foonathan_memory +target_link_libraries(ParticipantTests fastdds fastcdr foonathan_memory GTest::gmock ${CMAKE_DL_LIBS}) diff --git a/test/unittest/dds/participant/ParticipantTests.cpp b/test/unittest/dds/participant/ParticipantTests.cpp index 7cf9d76db90..369782309e2 100644 --- a/test/unittest/dds/participant/ParticipantTests.cpp +++ b/test/unittest/dds/participant/ParticipantTests.cpp @@ -24,16 +24,9 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include #include #include +#include #include #include #include @@ -42,18 +35,18 @@ #include #include #include -#include #include +#include #include #include #include #include #include -#include -#include +#include #include #include -#include +#include +#include #include #include #include @@ -67,9 +60,7 @@ #include #include -#include "../../common/GTestPrinters.hpp" #include "../../logging/mock/MockConsumer.h" -#include "fastdds/dds/domain/DomainParticipant.hpp" #if defined(__cplusplus_winrt) #define GET_PID GetCurrentProcessId @@ -548,14 +539,6 @@ TEST(ParticipantTests, GetParticipantProfileQos) } -TEST(ParticipantTests, CreatePSMDomainParticipant) -{ - ::dds::domain::DomainParticipant participant = ::dds::core::null; - participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - - ASSERT_NE(participant, ::dds::core::null); -} - TEST(ParticipantTests, DeleteDomainParticipant) { DomainParticipant* participant = @@ -625,27 +608,6 @@ TEST(ParticipantTests, ChangeDefaultParticipantQos) PARTICIPANT_QOS_DEFAULT) == ReturnCode_t::RETCODE_OK); } -TEST(ParticipantTests, ChangePSMDefaultParticipantQos) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - - ::dds::domain::qos::DomainParticipantQos qos = participant.default_participant_qos(); - - ASSERT_EQ(qos, PARTICIPANT_QOS_DEFAULT); - - EntityFactoryQosPolicy entity_factory = qos.entity_factory(); - entity_factory.autoenable_created_entities = false; - qos.entity_factory(entity_factory); - - ASSERT_NO_THROW(participant.default_participant_qos(qos)); - ::dds::domain::qos::DomainParticipantQos pqos = participant.default_participant_qos(); - - ASSERT_EQ(qos, pqos); - ASSERT_EQ(pqos.entity_factory().autoenable_created_entities, false); - - ASSERT_NO_THROW(participant.default_participant_qos(PARTICIPANT_QOS_DEFAULT)); -} - TEST(ParticipantTests, ChangeDomainParticipantQos) { DomainParticipant* participant = @@ -669,25 +631,6 @@ TEST(ParticipantTests, ChangeDomainParticipantQos) } -TEST(ParticipantTests, ChangePSMDomainParticipantQos) -{ - ::dds::domain::DomainParticipant participant = ::dds::core::null; - participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - ::dds::domain::qos::DomainParticipantQos qos = participant.qos(); - - check_equivalent_qos(qos, PARTICIPANT_QOS_DEFAULT); - - qos.entity_factory().autoenable_created_entities = false; - ASSERT_NO_THROW(participant.qos(qos)); - ::dds::domain::qos::DomainParticipantQos pqos; - pqos = participant.qos(); - - ASSERT_FALSE(pqos == PARTICIPANT_QOS_DEFAULT); - ASSERT_EQ(qos, pqos); - ASSERT_EQ(qos.entity_factory().autoenable_created_entities, false); - -} - class DomainParticipantTest : public DomainParticipant { public: @@ -1827,15 +1770,6 @@ TEST(ParticipantTests, CreatePublisherWithProfile) ASSERT_TRUE(DomainParticipantFactory::get_instance()->delete_participant(participant) == ReturnCode_t::RETCODE_OK); } -TEST(ParticipantTests, CreatePSMPublisher) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - ::dds::pub::Publisher publisher = ::dds::core::null; - publisher = ::dds::pub::Publisher(participant); - - ASSERT_NE(publisher, ::dds::core::null); -} - TEST(ParticipantTests, ChangeDefaultPublisherQos) { DomainParticipant* participant = @@ -1862,22 +1796,6 @@ TEST(ParticipantTests, ChangeDefaultPublisherQos) ASSERT_TRUE(DomainParticipantFactory::get_instance()->delete_participant(participant) == ReturnCode_t::RETCODE_OK); } -TEST(ParticipantTests, ChangePSMDefaultPublisherQos) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - ::dds::pub::qos::PublisherQos qos = participant.default_publisher_qos(); - ASSERT_EQ(qos, PUBLISHER_QOS_DEFAULT); - - qos.entity_factory().autoenable_created_entities = false; - - ASSERT_NO_THROW(participant.default_publisher_qos(qos)); - - ::dds::pub::qos::PublisherQos pqos = participant.default_publisher_qos(); - - ASSERT_TRUE(qos == pqos); - ASSERT_EQ(pqos.entity_factory().autoenable_created_entities, false); -} - TEST(ParticipantTests, CreateSubscriber) { DomainParticipant* participant = @@ -1991,16 +1909,6 @@ TEST(ParticipantTests, GetPublisherProfileQos) } -TEST(ParticipantTests, CreatePSMSubscriber) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant( - (uint32_t)GET_PID() % 230, PARTICIPANT_QOS_DEFAULT); - ::dds::sub::Subscriber subscriber = ::dds::core::null; - subscriber = ::dds::sub::Subscriber(participant, SUBSCRIBER_QOS_DEFAULT); - - ASSERT_NE(subscriber, ::dds::core::null); -} - TEST(ParticipantTests, DeletePublisher) { DomainParticipant* participant = @@ -2053,22 +1961,6 @@ TEST(ParticipantTests, ChangeDefaultSubscriberQos) ASSERT_TRUE(DomainParticipantFactory::get_instance()->delete_participant(participant) == ReturnCode_t::RETCODE_OK); } -TEST(ParticipantTests, ChangePSMDefaultSubscriberQos) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - ::dds::sub::qos::SubscriberQos qos = participant.default_subscriber_qos(); - ASSERT_EQ(qos, SUBSCRIBER_QOS_DEFAULT); - - qos.entity_factory().autoenable_created_entities = false; - - ASSERT_NO_THROW(participant.default_subscriber_qos(qos)); - - ::dds::sub::qos::SubscriberQos pqos = participant.default_subscriber_qos(); - - ASSERT_TRUE(qos == pqos); - ASSERT_EQ(pqos.entity_factory().autoenable_created_entities, false); -} - TEST(ParticipantTests, ChangeDefaultTopicQos) { DomainParticipant* participant = @@ -2098,22 +1990,6 @@ TEST(ParticipantTests, ChangeDefaultTopicQos) ASSERT_TRUE(DomainParticipantFactory::get_instance()->delete_participant(participant) == ReturnCode_t::RETCODE_OK); } -TEST(ParticipantTests, ChangePSMDefaultTopicQos) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - ::dds::topic::qos::TopicQos qos = participant.default_topic_qos(); - - ASSERT_EQ(qos, TOPIC_QOS_DEFAULT); - - qos.ownership().kind = EXCLUSIVE_OWNERSHIP_QOS; - - ASSERT_NO_THROW(participant.default_topic_qos(qos)); - - ::dds::topic::qos::TopicQos tqos = participant.default_topic_qos(); - ASSERT_EQ(qos, tqos); - ASSERT_EQ(tqos.ownership().kind, EXCLUSIVE_OWNERSHIP_QOS); -} - void check_topic_with_profile ( Topic* topic, const std::string& profile_name) @@ -2245,19 +2121,6 @@ TEST(ParticipantTests, CreateTopicWithDifferentTypeName_negative) } } -TEST(ParticipantTests, PSMCreateTopic) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - - TypeSupport type(new TopicDataTypeMock()); - type.register_type(participant.delegate().get(), "footype"); - - ::dds::topic::Topic topic = ::dds::core::null; - topic = ::dds::topic::Topic(participant, "footopic", "footype", TOPIC_QOS_DEFAULT); - - ASSERT_NE(topic, ::dds::core::null); -} - TEST(ParticipantTests, DeleteTopic) { uint32_t domain_id = (uint32_t)GET_PID() % 230; @@ -2502,8 +2365,10 @@ class CustomListener2 : public DomainParticipantListener void on_participant_discovery( eprosima::fastdds::dds::DomainParticipant*, - eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&&) override + eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&&, + bool& should_be_ignored) override { + static_cast(should_be_ignored); try { promise_.set_value(); diff --git a/test/unittest/dds/profiles/test_xml_for_string_profile.xml b/test/unittest/dds/profiles/test_xml_for_string_profile.xml index 0f25801a726..50c0a6bcbc8 100644 --- a/test/unittest/dds/profiles/test_xml_for_string_profile.xml +++ b/test/unittest/dds/profiles/test_xml_for_string_profile.xml @@ -1,5 +1,5 @@ - + FULL diff --git a/test/unittest/dds/profiles/test_xml_profile.xml b/test/unittest/dds/profiles/test_xml_profile.xml index 791c89cc146..1bbaee3db9f 100644 --- a/test/unittest/dds/profiles/test_xml_profile.xml +++ b/test/unittest/dds/profiles/test_xml_profile.xml @@ -1,5 +1,5 @@ - + 123 diff --git a/test/unittest/dds/publisher/CMakeLists.txt b/test/unittest/dds/publisher/CMakeLists.txt index 72e1e505d3f..1ff5b01a3bb 100644 --- a/test/unittest/dds/publisher/CMakeLists.txt +++ b/test/unittest/dds/publisher/CMakeLists.txt @@ -53,7 +53,6 @@ set(DATAWRITERTESTS_SOURCE DataWriterTests.cpp ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeObjectFactory.cpp ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeObjectHashId.cpp ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypesBase.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/builtin/common/RPCHeadersImpl.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/builtin/typelookup/common/TypeLookupTypes.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/builtin/typelookup/TypeLookupManager.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/builtin/typelookup/TypeLookupReplyListener.cpp @@ -307,7 +306,6 @@ set(DATAWRITERTESTS_SOURCE DataWriterTests.cpp endif(TINYXML2_INCLUDE_DIR) set(PUBLISHERTESTS_SOURCE PublisherTests.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/dds/pub/DataWriter.cpp ) if(WIN32) @@ -342,7 +340,7 @@ target_include_directories(PublisherTests PRIVATE ${PROJECT_SOURCE_DIR}/src/cpp ${PROJECT_SOURCE_DIR}/thirdparty/taocpp-pegtl ) -target_link_libraries(PublisherTests fastrtps fastcdr foonathan_memory +target_link_libraries(PublisherTests fastdds fastcdr foonathan_memory GTest::gmock ${CMAKE_DL_LIBS}) if(QNX) diff --git a/test/unittest/dds/publisher/DataWriterTests.cpp b/test/unittest/dds/publisher/DataWriterTests.cpp index 529a46ca80d..2cdf1efa269 100644 --- a/test/unittest/dds/publisher/DataWriterTests.cpp +++ b/test/unittest/dds/publisher/DataWriterTests.cpp @@ -22,10 +22,6 @@ #include #include -#include -#include -#include -#include #include #include #include @@ -40,10 +36,11 @@ #include #include #include -#include #include #include +#include + #include "../../common/CustomPayloadPool.hpp" #include "../../logging/mock/MockConsumer.h" diff --git a/test/unittest/dds/publisher/PublisherTests.cpp b/test/unittest/dds/publisher/PublisherTests.cpp index 1b14b36dd1d..85b185602fd 100644 --- a/test/unittest/dds/publisher/PublisherTests.cpp +++ b/test/unittest/dds/publisher/PublisherTests.cpp @@ -17,12 +17,6 @@ #include #include -#include -#include -#include -#include -#include -#include #include #include #include @@ -33,7 +27,6 @@ #include #include #include -#include #include namespace eprosima { @@ -215,15 +208,6 @@ TEST(PublisherTests, GetPublisherParticipant) ASSERT_TRUE(DomainParticipantFactory::get_instance()->delete_participant(participant) == ReturnCode_t::RETCODE_OK); } -TEST(PublisherTests, GetPSMPublisherParticipant) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - ::dds::pub::Publisher publisher = ::dds::pub::Publisher(participant, PUBLISHER_QOS_DEFAULT); - - ASSERT_EQ(publisher.participant().delegate().get(), participant.delegate().get()); - -} - TEST(PublisherTests, ChangeDefaultDataWriterQos) { DomainParticipant* participant = @@ -448,23 +432,6 @@ TEST(PublisherTests, ChangeDefaultDataWriterQos) } -TEST(PublisherTests, ChangePSMDefaultDataWriterQos) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - ::dds::pub::Publisher publisher = ::dds::pub::Publisher(participant); - - ::dds::pub::qos::DataWriterQos qos = publisher.default_datawriter_qos(); - ASSERT_EQ(qos, DATAWRITER_QOS_DEFAULT); - - qos.deadline().period = 540; - - ASSERT_NO_THROW(publisher.default_datawriter_qos(qos)); - ::dds::pub::qos::DataWriterQos wqos = publisher.default_datawriter_qos(); - - ASSERT_TRUE(qos == wqos); - ASSERT_EQ(wqos.deadline().period, 540); -} - TEST(PublisherTests, ChangePublisherQos) { DomainParticipant* participant = @@ -492,22 +459,6 @@ TEST(PublisherTests, ChangePublisherQos) } -TEST(PublisherTests, ChangePSMPublisherQos) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - ::dds::pub::Publisher publisher = ::dds::pub::Publisher(participant); - - ::dds::pub::qos::PublisherQos qos = publisher.qos(); - ASSERT_EQ(qos, PUBLISHER_QOS_DEFAULT); - - qos.entity_factory().autoenable_created_entities = false; - publisher.qos(qos); - ::dds::pub::qos::PublisherQos pqos = publisher.qos(); - - ASSERT_TRUE(qos == pqos); - ASSERT_EQ(pqos.entity_factory().autoenable_created_entities, false); -} - TEST(PublisherTests, CreateDataWriter) { DomainParticipant* participant = diff --git a/test/unittest/dds/status/ListenerTests.cpp b/test/unittest/dds/status/ListenerTests.cpp index 61afbb40dcf..337d999e310 100644 --- a/test/unittest/dds/status/ListenerTests.cpp +++ b/test/unittest/dds/status/ListenerTests.cpp @@ -161,7 +161,7 @@ class CustomDataReaderListener : public DataReaderListener void on_requested_deadline_missed( DataReader*, - const fastrtps::RequestedDeadlineMissedStatus&) + const RequestedDeadlineMissedStatus&) { on_requested_deadline_missed_relay(); } @@ -170,7 +170,7 @@ class CustomDataReaderListener : public DataReaderListener void on_liveliness_changed( DataReader*, - const fastrtps::LivelinessChangedStatus&) + const LivelinessChangedStatus&) { on_liveliness_changed_relay(); } @@ -179,7 +179,7 @@ class CustomDataReaderListener : public DataReaderListener void on_sample_rejected( DataReader*, - const fastrtps::SampleRejectedStatus&) + const SampleRejectedStatus&) { on_sample_rejected_relay(); } @@ -236,7 +236,7 @@ class CustomSubscriberListener : public SubscriberListener void on_requested_deadline_missed( DataReader*, - const fastrtps::RequestedDeadlineMissedStatus&) + const RequestedDeadlineMissedStatus&) { on_requested_deadline_missed_relay(); } @@ -245,7 +245,7 @@ class CustomSubscriberListener : public SubscriberListener void on_liveliness_changed( DataReader*, - const fastrtps::LivelinessChangedStatus&) + const LivelinessChangedStatus&) { on_liveliness_changed_relay(); } @@ -254,7 +254,7 @@ class CustomSubscriberListener : public SubscriberListener void on_sample_rejected( DataReader*, - const fastrtps::SampleRejectedStatus&) + const SampleRejectedStatus&) { on_sample_rejected_relay(); } @@ -429,7 +429,7 @@ class CustomParticipantListener : public DomainParticipantListener void on_requested_deadline_missed( DataReader*, - const fastrtps::RequestedDeadlineMissedStatus&) + const RequestedDeadlineMissedStatus&) { on_requested_deadline_missed_relay(); } @@ -438,7 +438,7 @@ class CustomParticipantListener : public DomainParticipantListener void on_liveliness_changed( DataReader*, - const fastrtps::LivelinessChangedStatus&) + const LivelinessChangedStatus&) { on_liveliness_changed_relay(); } @@ -447,7 +447,7 @@ class CustomParticipantListener : public DomainParticipantListener void on_sample_rejected( DataReader*, - const fastrtps::SampleRejectedStatus&) + const SampleRejectedStatus&) { on_sample_rejected_relay(); } diff --git a/test/unittest/dds/subscriber/CMakeLists.txt b/test/unittest/dds/subscriber/CMakeLists.txt index b77b83e8739..df39e9b5c92 100644 --- a/test/unittest/dds/subscriber/CMakeLists.txt +++ b/test/unittest/dds/subscriber/CMakeLists.txt @@ -75,7 +75,7 @@ target_include_directories(SubscriberTests PRIVATE ${PROJECT_SOURCE_DIR}/include ${PROJECT_BINARY_DIR}/include ${PROJECT_SOURCE_DIR}/src/cpp ) -target_link_libraries(SubscriberTests fastrtps fastcdr foonathan_memory +target_link_libraries(SubscriberTests fastdds fastcdr foonathan_memory GTest::gmock ${CMAKE_DL_LIBS}) gtest_discover_tests(SubscriberTests) @@ -94,7 +94,7 @@ target_include_directories(DataReaderTests PRIVATE ${PROJECT_SOURCE_DIR}/src/cpp ${Asio_INCLUDE_DIR} ) -target_link_libraries(DataReaderTests fastrtps fastcdr foonathan_memory +target_link_libraries(DataReaderTests fastdds fastcdr foonathan_memory GTest::gmock ${CMAKE_DL_LIBS}) gtest_discover_tests(DataReaderTests) diff --git a/test/unittest/dds/subscriber/DataReaderTests.cpp b/test/unittest/dds/subscriber/DataReaderTests.cpp index d06472baa73..f7773a41dd7 100644 --- a/test/unittest/dds/subscriber/DataReaderTests.cpp +++ b/test/unittest/dds/subscriber/DataReaderTests.cpp @@ -2886,10 +2886,10 @@ TEST_F(DataReaderTests, read_conditions_management) TEST_F(DataReaderTests, read_conditions_wait_on_SampleStateMask) { DataReaderQos reader_qos = DATAREADER_QOS_DEFAULT; - reader_qos.reliability().kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + reader_qos.reliability().kind = RELIABLE_RELIABILITY_QOS; DataWriterQos writer_qos = DATAWRITER_QOS_DEFAULT; - writer_qos.reliability().kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + writer_qos.reliability().kind = RELIABLE_RELIABILITY_QOS; create_entities(nullptr, reader_qos, SUBSCRIBER_QOS_DEFAULT, writer_qos); DataReader& data_reader = *data_reader_; @@ -2998,10 +2998,10 @@ TEST_F(DataReaderTests, read_conditions_wait_on_SampleStateMask) TEST_F(DataReaderTests, read_conditions_wait_on_ViewStateMask) { DataReaderQos reader_qos = DATAREADER_QOS_DEFAULT; - reader_qos.reliability().kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + reader_qos.reliability().kind = RELIABLE_RELIABILITY_QOS; DataWriterQos writer_qos = DATAWRITER_QOS_DEFAULT; - writer_qos.reliability().kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + writer_qos.reliability().kind = RELIABLE_RELIABILITY_QOS; create_entities(nullptr, reader_qos, SUBSCRIBER_QOS_DEFAULT, writer_qos); DataReader& data_reader = *data_reader_; @@ -3097,10 +3097,10 @@ TEST_F(DataReaderTests, read_conditions_wait_on_ViewStateMask) TEST_F(DataReaderTests, read_conditions_wait_on_InstanceStateMask) { DataReaderQos reader_qos = DATAREADER_QOS_DEFAULT; - reader_qos.reliability().kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + reader_qos.reliability().kind = RELIABLE_RELIABILITY_QOS; DataWriterQos writer_qos = DATAWRITER_QOS_DEFAULT; - writer_qos.reliability().kind = eprosima::fastrtps::RELIABLE_RELIABILITY_QOS; + writer_qos.reliability().kind = RELIABLE_RELIABILITY_QOS; create_entities(nullptr, reader_qos, SUBSCRIBER_QOS_DEFAULT, writer_qos); DataReader& data_reader = *data_reader_; diff --git a/test/unittest/dds/subscriber/SubscriberTests.cpp b/test/unittest/dds/subscriber/SubscriberTests.cpp index 1c0afb37849..2b900daf90f 100644 --- a/test/unittest/dds/subscriber/SubscriberTests.cpp +++ b/test/unittest/dds/subscriber/SubscriberTests.cpp @@ -17,34 +17,27 @@ #include -#include -#include -#include -#include -#include -#include -#include #include #include #include #include #include +#include #include #include #include #include #include #include +#include #include #include -#include #include namespace eprosima { namespace fastdds { namespace dds { -using fastrtps::PublisherAttributes; using fastrtps::SubscriberAttributes; using fastrtps::rtps::PropertyPolicyHelper; using fastrtps::xmlparser::XMLProfileManager; @@ -253,22 +246,6 @@ TEST(SubscriberTests, ChangeSubscriberQos) } -TEST(SubscriberTests, ChangePSMSubscriberQos) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - ::dds::sub::Subscriber subscriber = ::dds::sub::Subscriber(participant); - - ::dds::sub::qos::SubscriberQos qos = subscriber.qos(); - ASSERT_EQ(qos, SUBSCRIBER_QOS_DEFAULT); - - qos.entity_factory().autoenable_created_entities = false; - ASSERT_NO_THROW(subscriber.qos(qos)); - ::dds::sub::qos::SubscriberQos pqos = subscriber.qos(); - - ASSERT_TRUE(qos == pqos); - ASSERT_EQ(pqos.entity_factory().autoenable_created_entities, false); -} - TEST(SubscriberTests, ChangeDefaultDataReaderQos) { DomainParticipant* participant = @@ -515,24 +492,6 @@ TEST(SubscriberTests, ChangeDefaultDataReaderQos) ASSERT_TRUE(DomainParticipantFactory::get_instance()->delete_participant(participant) == ReturnCode_t::RETCODE_OK); } -TEST(SubscriberTests, ChangePSMDefaultDataReaderQos) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - ::dds::sub::Subscriber subscriber = ::dds::sub::Subscriber(participant, SUBSCRIBER_QOS_DEFAULT); - - ::dds::sub::qos::DataReaderQos qos = subscriber.default_datareader_qos(); - ASSERT_EQ(qos, DATAREADER_QOS_DEFAULT); - - qos.reliability().kind = BEST_EFFORT_RELIABILITY_QOS; - - ASSERT_NO_THROW(subscriber.default_datareader_qos(qos)); - - ::dds::sub::qos::DataReaderQos rqos = subscriber.default_datareader_qos(); - - ASSERT_EQ(qos, rqos); - ASSERT_EQ(rqos.reliability().kind, BEST_EFFORT_RELIABILITY_QOS); -} - TEST(SubscriberTests, GetSubscriberParticipant) { DomainParticipant* participant = @@ -547,14 +506,6 @@ TEST(SubscriberTests, GetSubscriberParticipant) ASSERT_TRUE(DomainParticipantFactory::get_instance()->delete_participant(participant) == ReturnCode_t::RETCODE_OK); } -TEST(SubscriberTests, GetPSMSubscriberParticipant) -{ - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - ::dds::sub::Subscriber subscriber = ::dds::sub::Subscriber(participant, SUBSCRIBER_QOS_DEFAULT); - - ASSERT_EQ(subscriber.participant().delegate().get(), participant.delegate().get()); -} - TEST(SubscriberTests, CreateDataReader) { DomainParticipant* participant = @@ -726,32 +677,6 @@ TEST(SubscriberTests, DeleteSubscriberWithReaders) ASSERT_EQ(DomainParticipantFactory::get_instance()->delete_participant(participant), ReturnCode_t::RETCODE_OK); } -//TODO: [ILG] Activate the test once PSM API for DataReader is in place -/* - TEST(SubscriberTests, CreatePSMDataReader) - { - ::dds::domain::DomainParticipant participant = ::dds::domain::DomainParticipant(0, PARTICIPANT_QOS_DEFAULT); - - ::dds::sub::Subscriber subscriber = ::dds::core::null; - subscriber = ::dds::sub::Subscriber(participant); - - ASSERT_NE(subscriber, ::dds::core::null); - - TypeSupport type(new TopicDataTypeMock()); - type.register_type(participant.delegate().get()); - - ::dds::topic::Topic topic = ::dds::core::null; - topic = ::dds::topic::Topic(participant, "footopic", type_->getName(), TOPIC_QOS_DEFAULT); - - ASSERT_NE(topic, ::dds::core::null); - - ::dds::sub::DataReader data_reader = ::dds::core::null; - data_reader = ::dds::sub::DataReader(subscriber, topic); - - ASSERT_NE(data_reader, ::dds::core::null); - } - */ - void set_listener_test ( Subscriber* subscriber, SubscriberListener* listener, @@ -959,7 +884,7 @@ TEST(SubscriberTests, DeleteContainedEntities) EXPECT_TRUE(data_reader_foo->wait_for_unread_message(wait_time)); LoanableSequence mock_coll; - SampleInfoSeq mock_seq; + fastdds::dds::SampleInfoSeq mock_seq; ASSERT_EQ(data_reader_foo->take(mock_coll, mock_seq), ReturnCode_t::RETCODE_OK); diff --git a/test/unittest/dds/topic/CMakeLists.txt b/test/unittest/dds/topic/CMakeLists.txt index e647f1048a1..051ee0b586e 100644 --- a/test/unittest/dds/topic/CMakeLists.txt +++ b/test/unittest/dds/topic/CMakeLists.txt @@ -31,7 +31,7 @@ target_include_directories(TopicTests PRIVATE ${PROJECT_SOURCE_DIR}/include ${PROJECT_BINARY_DIR}/include ${PROJECT_SOURCE_DIR}/src/cpp ) -target_link_libraries(TopicTests fastrtps fastcdr foonathan_memory +target_link_libraries(TopicTests fastdds fastcdr foonathan_memory GTest::gmock ${CMAKE_DL_LIBS}) gtest_discover_tests(TopicTests) diff --git a/test/unittest/dds/topic/TopicTests.cpp b/test/unittest/dds/topic/TopicTests.cpp index bd102150bfe..43a8ea33a80 100644 --- a/test/unittest/dds/topic/TopicTests.cpp +++ b/test/unittest/dds/topic/TopicTests.cpp @@ -15,21 +15,16 @@ #include #include -#include #include +#include +#include +#include +#include #include #include -#include -#include - -#include -#include -#include - #include #include - namespace eprosima { namespace fastdds { namespace dds { diff --git a/test/unittest/dynamic_types/types_profile.xml b/test/unittest/dynamic_types/types_profile.xml index bb0bffdfe07..2d0f5c75c90 100644 --- a/test/unittest/dynamic_types/types_profile.xml +++ b/test/unittest/dynamic_types/types_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/unittest/rtps/DataSharing/CMakeLists.txt b/test/unittest/rtps/DataSharing/CMakeLists.txt index ca66e5558ce..b769066e807 100644 --- a/test/unittest/rtps/DataSharing/CMakeLists.txt +++ b/test/unittest/rtps/DataSharing/CMakeLists.txt @@ -38,7 +38,7 @@ target_include_directories(SHMSegmentTests PRIVATE ${THIRDPARTY_BOOST_INCLUDE_DIR} ) target_link_libraries(SHMSegmentTests - fastcdr fastrtps foonathan_memory + fastcdr fastdds foonathan_memory GTest::gmock ${CMAKE_DL_LIBS} ${CMAKE_DL_LIBS} diff --git a/test/unittest/rtps/DataSharing/SHMSegmentTests.cpp b/test/unittest/rtps/DataSharing/SHMSegmentTests.cpp index 495cdde0aa9..70cb3f07343 100644 --- a/test/unittest/rtps/DataSharing/SHMSegmentTests.cpp +++ b/test/unittest/rtps/DataSharing/SHMSegmentTests.cpp @@ -12,22 +12,21 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "fastdds/rtps/common/Types.h" -#include "fastrtps/qos/QosPolicies.h" #include #include -#include +#include "fastdds/rtps/common/Types.h" +#include +#include #include +#include #include -#include +#include #include #include #include -#include - namespace eprosima { namespace fastrtps { namespace rtps { diff --git a/test/unittest/rtps/builtin/BuiltinDataSerializationTests.cpp b/test/unittest/rtps/builtin/BuiltinDataSerializationTests.cpp index ae7274f243a..b35f180aad9 100644 --- a/test/unittest/rtps/builtin/BuiltinDataSerializationTests.cpp +++ b/test/unittest/rtps/builtin/BuiltinDataSerializationTests.cpp @@ -20,16 +20,16 @@ #include #include #include +#include +#include +#include +#include #include #include #include #include #include #include -#include -#include -#include -#include #include diff --git a/test/unittest/rtps/common/CacheChangeTests.cpp b/test/unittest/rtps/common/CacheChangeTests.cpp index d9f07608ad6..bdc53a79063 100644 --- a/test/unittest/rtps/common/CacheChangeTests.cpp +++ b/test/unittest/rtps/common/CacheChangeTests.cpp @@ -12,12 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include - #include #include + #include +#include + using namespace eprosima::fastrtps::rtps; struct FragmentTestStep @@ -28,12 +29,14 @@ struct FragmentTestStep { uint32_t initial_fragment; uint16_t num_fragments; - } input; + } + input; struct __Check { bool missing_fragments[10]; - } check; + } + check; void do_test( CacheChange_t& uut) const @@ -134,7 +137,7 @@ TEST(CacheChange, FragmentManagement) int main( int argc, - char **argv) + char** argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/test/unittest/rtps/common/PortParametersTests.cpp b/test/unittest/rtps/common/PortParametersTests.cpp index 6eb2bdd5b69..a0eacc02ab3 100644 --- a/test/unittest/rtps/common/PortParametersTests.cpp +++ b/test/unittest/rtps/common/PortParametersTests.cpp @@ -12,11 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include - #include + #include +#include + using namespace eprosima::fastrtps::rtps; /*! @@ -88,7 +89,9 @@ TEST(PortParametersDeathTest, Limit_Multicast_Domain_FAIL) ASSERT_EXIT( { params.getMulticastPort(233); }, ::testing::ExitedWithCode(EXIT_FAILURE), ""); } -int main(int argc, char **argv) +int main( + int argc, + char** argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/test/unittest/rtps/common/SequenceNumberTests.cpp b/test/unittest/rtps/common/SequenceNumberTests.cpp index 09708e42021..96f8252832b 100644 --- a/test/unittest/rtps/common/SequenceNumberTests.cpp +++ b/test/unittest/rtps/common/SequenceNumberTests.cpp @@ -12,11 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include - #include + #include +#include + using namespace eprosima::fastrtps::rtps; /*! @@ -445,7 +446,7 @@ TEST(SequenceNumberSet, AddOperation) ASSERT_TRUE(set.add(seq)); seq += 3; - + ASSERT_FALSE(set.add(seq)); } @@ -490,7 +491,9 @@ TEST(SequenceNumberSet, GetMaxSeqNumOperation) ASSERT_EQ(set.max(), expected_seq); } -int main(int argc, char **argv) +int main( + int argc, + char** argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/test/unittest/rtps/common/TimeTests.cpp b/test/unittest/rtps/common/TimeTests.cpp index 5f8521bfc20..ca00d4e278c 100644 --- a/test/unittest/rtps/common/TimeTests.cpp +++ b/test/unittest/rtps/common/TimeTests.cpp @@ -12,10 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include - #include +#include + using namespace eprosima::fastrtps::rtps; /* diff --git a/test/unittest/rtps/discovery/CMakeLists.txt b/test/unittest/rtps/discovery/CMakeLists.txt index b0217786eff..008079adcf4 100644 --- a/test/unittest/rtps/discovery/CMakeLists.txt +++ b/test/unittest/rtps/discovery/CMakeLists.txt @@ -189,7 +189,7 @@ set(PDPTESTS_SOURCE PDPTests.cpp add_executable(PDPTests ${PDPTESTS_SOURCE}) -target_compile_definitions(PDPTests PRIVATE FASTRTPS_NO_LIB +target_compile_definitions(PDPTests PRIVATE FASTDDS_NO_LIB BOOST_ASIO_STANDALONE ASIO_STANDALONE $<$>,$>:__DEBUG> diff --git a/test/unittest/rtps/discovery/EdpTests.cpp b/test/unittest/rtps/discovery/EdpTests.cpp index 930d13ba9dc..95b3a471775 100644 --- a/test/unittest/rtps/discovery/EdpTests.cpp +++ b/test/unittest/rtps/discovery/EdpTests.cpp @@ -15,14 +15,14 @@ #include #include +#include +#include #include #include -#include -#include + #include #include - namespace eprosima { namespace fastrtps { namespace rtps { @@ -266,23 +266,39 @@ TEST_F(EdpTests, CheckPartitionCompatibility) TEST_F(EdpTests, CheckDurabilityCompatibility) { - std::vector> testing_cases{ - { PERSISTENT_DURABILITY_QOS, PERSISTENT_DURABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { PERSISTENT_DURABILITY_QOS, TRANSIENT_DURABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { PERSISTENT_DURABILITY_QOS, TRANSIENT_LOCAL_DURABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { PERSISTENT_DURABILITY_QOS, VOLATILE_DURABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { TRANSIENT_DURABILITY_QOS, PERSISTENT_DURABILITY_QOS, fastdds::dds::DURABILITY_QOS_POLICY_ID}, - { TRANSIENT_DURABILITY_QOS, TRANSIENT_DURABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { TRANSIENT_DURABILITY_QOS, TRANSIENT_LOCAL_DURABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { TRANSIENT_DURABILITY_QOS, VOLATILE_DURABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { TRANSIENT_LOCAL_DURABILITY_QOS, PERSISTENT_DURABILITY_QOS, fastdds::dds::DURABILITY_QOS_POLICY_ID}, - { TRANSIENT_LOCAL_DURABILITY_QOS, TRANSIENT_DURABILITY_QOS, fastdds::dds::DURABILITY_QOS_POLICY_ID}, - { TRANSIENT_LOCAL_DURABILITY_QOS, TRANSIENT_LOCAL_DURABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { TRANSIENT_LOCAL_DURABILITY_QOS, VOLATILE_DURABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { VOLATILE_DURABILITY_QOS, PERSISTENT_DURABILITY_QOS, fastdds::dds::DURABILITY_QOS_POLICY_ID}, - { VOLATILE_DURABILITY_QOS, TRANSIENT_DURABILITY_QOS, fastdds::dds::DURABILITY_QOS_POLICY_ID}, - { VOLATILE_DURABILITY_QOS, TRANSIENT_LOCAL_DURABILITY_QOS, fastdds::dds::DURABILITY_QOS_POLICY_ID}, - { VOLATILE_DURABILITY_QOS, VOLATILE_DURABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID} + std::vector> testing_cases{ + { fastdds::dds::PERSISTENT_DURABILITY_QOS, fastdds::dds::PERSISTENT_DURABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::PERSISTENT_DURABILITY_QOS, fastdds::dds::TRANSIENT_DURABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::PERSISTENT_DURABILITY_QOS, fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::PERSISTENT_DURABILITY_QOS, fastdds::dds::VOLATILE_DURABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::TRANSIENT_DURABILITY_QOS, fastdds::dds::PERSISTENT_DURABILITY_QOS, + fastdds::dds::DURABILITY_QOS_POLICY_ID}, + { fastdds::dds::TRANSIENT_DURABILITY_QOS, fastdds::dds::TRANSIENT_DURABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::TRANSIENT_DURABILITY_QOS, fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::TRANSIENT_DURABILITY_QOS, fastdds::dds::VOLATILE_DURABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS, fastdds::dds::PERSISTENT_DURABILITY_QOS, + fastdds::dds::DURABILITY_QOS_POLICY_ID}, + { fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS, fastdds::dds::TRANSIENT_DURABILITY_QOS, + fastdds::dds::DURABILITY_QOS_POLICY_ID}, + { fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS, fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS, fastdds::dds::VOLATILE_DURABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::VOLATILE_DURABILITY_QOS, fastdds::dds::PERSISTENT_DURABILITY_QOS, + fastdds::dds::DURABILITY_QOS_POLICY_ID}, + { fastdds::dds::VOLATILE_DURABILITY_QOS, fastdds::dds::TRANSIENT_DURABILITY_QOS, + fastdds::dds::DURABILITY_QOS_POLICY_ID}, + { fastdds::dds::VOLATILE_DURABILITY_QOS, fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS, + fastdds::dds::DURABILITY_QOS_POLICY_ID}, + { fastdds::dds::VOLATILE_DURABILITY_QOS, fastdds::dds::VOLATILE_DURABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID} }; for (auto testing_case : testing_cases) @@ -311,11 +327,14 @@ TEST_F(EdpTests, CheckDeadlineCompatibility) TEST_F(EdpTests, CheckOwnershipCompatibility) { - std::vector> testing_cases{ - { SHARED_OWNERSHIP_QOS, SHARED_OWNERSHIP_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { SHARED_OWNERSHIP_QOS, EXCLUSIVE_OWNERSHIP_QOS, fastdds::dds::OWNERSHIP_QOS_POLICY_ID}, - { EXCLUSIVE_OWNERSHIP_QOS, SHARED_OWNERSHIP_QOS, fastdds::dds::OWNERSHIP_QOS_POLICY_ID}, - { EXCLUSIVE_OWNERSHIP_QOS, EXCLUSIVE_OWNERSHIP_QOS, fastdds::dds::INVALID_QOS_POLICY_ID} + std::vector> testing_cases{ + { fastdds::dds::SHARED_OWNERSHIP_QOS, fastdds::dds::SHARED_OWNERSHIP_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::SHARED_OWNERSHIP_QOS, fastdds::dds::EXCLUSIVE_OWNERSHIP_QOS, + fastdds::dds::OWNERSHIP_QOS_POLICY_ID}, + { fastdds::dds::EXCLUSIVE_OWNERSHIP_QOS, fastdds::dds::SHARED_OWNERSHIP_QOS, + fastdds::dds::OWNERSHIP_QOS_POLICY_ID}, + { fastdds::dds::EXCLUSIVE_OWNERSHIP_QOS, fastdds::dds::EXCLUSIVE_OWNERSHIP_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID} }; for (auto testing_case : testing_cases) @@ -328,17 +347,25 @@ TEST_F(EdpTests, CheckOwnershipCompatibility) TEST_F(EdpTests, CheckLivelinessKindCompatibility) { - std::vector> testing_cases{ - { MANUAL_BY_TOPIC_LIVELINESS_QOS, MANUAL_BY_TOPIC_LIVELINESS_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { MANUAL_BY_TOPIC_LIVELINESS_QOS, MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { MANUAL_BY_TOPIC_LIVELINESS_QOS, AUTOMATIC_LIVELINESS_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, MANUAL_BY_TOPIC_LIVELINESS_QOS, fastdds::dds::LIVELINESS_QOS_POLICY_ID}, - { MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, + std::vector> testing_cases{ + { fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, fastdds::dds::AUTOMATIC_LIVELINESS_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, + fastdds::dds::LIVELINESS_QOS_POLICY_ID}, + { fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, fastdds::dds::AUTOMATIC_LIVELINESS_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, AUTOMATIC_LIVELINESS_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { AUTOMATIC_LIVELINESS_QOS, MANUAL_BY_TOPIC_LIVELINESS_QOS, fastdds::dds::LIVELINESS_QOS_POLICY_ID}, - { AUTOMATIC_LIVELINESS_QOS, MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, fastdds::dds::LIVELINESS_QOS_POLICY_ID}, - { AUTOMATIC_LIVELINESS_QOS, AUTOMATIC_LIVELINESS_QOS, fastdds::dds::INVALID_QOS_POLICY_ID} + { fastdds::dds::AUTOMATIC_LIVELINESS_QOS, fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, + fastdds::dds::LIVELINESS_QOS_POLICY_ID}, + { fastdds::dds::AUTOMATIC_LIVELINESS_QOS, fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, + fastdds::dds::LIVELINESS_QOS_POLICY_ID}, + { fastdds::dds::AUTOMATIC_LIVELINESS_QOS, fastdds::dds::AUTOMATIC_LIVELINESS_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID} }; for (auto testing_case : testing_cases) @@ -367,11 +394,15 @@ TEST_F(EdpTests, CheckLeaseDurationCompatibility) TEST_F(EdpTests, CheckReliabilityCompatibility) { - std::vector> testing_cases{ - { RELIABLE_RELIABILITY_QOS, RELIABLE_RELIABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { RELIABLE_RELIABILITY_QOS, BEST_EFFORT_RELIABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID}, - { BEST_EFFORT_RELIABILITY_QOS, RELIABLE_RELIABILITY_QOS, fastdds::dds::RELIABILITY_QOS_POLICY_ID}, - { BEST_EFFORT_RELIABILITY_QOS, BEST_EFFORT_RELIABILITY_QOS, fastdds::dds::INVALID_QOS_POLICY_ID} + std::vector> testing_cases{ + { fastdds::dds::RELIABLE_RELIABILITY_QOS, fastdds::dds::RELIABLE_RELIABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::RELIABLE_RELIABILITY_QOS, fastdds::dds::BEST_EFFORT_RELIABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID}, + { fastdds::dds::BEST_EFFORT_RELIABILITY_QOS, fastdds::dds::RELIABLE_RELIABILITY_QOS, + fastdds::dds::RELIABILITY_QOS_POLICY_ID}, + { fastdds::dds::BEST_EFFORT_RELIABILITY_QOS, fastdds::dds::BEST_EFFORT_RELIABILITY_QOS, + fastdds::dds::INVALID_QOS_POLICY_ID} }; for (auto testing_case : testing_cases) @@ -401,28 +432,38 @@ TEST_F(EdpTests, CheckPositiveAckCompatibility) TEST_F(EdpTests, CheckDataRepresentationCompatibility) { - using DataRepresentationQosVector = std::vector; + using DataRepresentationQosVector = std::vector; std::vector> testing_cases{ { {}, {}, fastdds::dds::INVALID_QOS_POLICY_ID}, - { {}, {DataRepresentationId::XCDR_DATA_REPRESENTATION}, fastdds::dds::INVALID_QOS_POLICY_ID}, - { {}, {DataRepresentationId::XCDR_DATA_REPRESENTATION, DataRepresentationId::XCDR2_DATA_REPRESENTATION}, + { {}, {fastdds::dds::DataRepresentationId::XCDR_DATA_REPRESENTATION}, fastdds::dds::INVALID_QOS_POLICY_ID}, + { {}, + {fastdds::dds::DataRepresentationId::XCDR_DATA_REPRESENTATION, + fastdds::dds::DataRepresentationId::XCDR2_DATA_REPRESENTATION}, fastdds::dds::INVALID_QOS_POLICY_ID}, - { {}, {DataRepresentationId::XCDR2_DATA_REPRESENTATION}, fastdds::dds::DATAREPRESENTATION_QOS_POLICY_ID}, - { {DataRepresentationId::XCDR_DATA_REPRESENTATION}, {}, fastdds::dds::INVALID_QOS_POLICY_ID}, - { {DataRepresentationId::XCDR_DATA_REPRESENTATION}, {DataRepresentationId::XCDR_DATA_REPRESENTATION}, + { {}, {fastdds::dds::DataRepresentationId::XCDR2_DATA_REPRESENTATION}, + fastdds::dds::DATAREPRESENTATION_QOS_POLICY_ID}, + { {fastdds::dds::DataRepresentationId::XCDR_DATA_REPRESENTATION}, {}, fastdds::dds::INVALID_QOS_POLICY_ID}, + { {fastdds::dds::DataRepresentationId::XCDR_DATA_REPRESENTATION}, + {fastdds::dds::DataRepresentationId::XCDR_DATA_REPRESENTATION}, fastdds::dds::INVALID_QOS_POLICY_ID}, - { {DataRepresentationId::XCDR_DATA_REPRESENTATION}, - {DataRepresentationId::XCDR_DATA_REPRESENTATION, DataRepresentationId::XCDR2_DATA_REPRESENTATION}, + { {fastdds::dds::DataRepresentationId::XCDR_DATA_REPRESENTATION}, + {fastdds::dds::DataRepresentationId::XCDR_DATA_REPRESENTATION, + fastdds::dds::DataRepresentationId::XCDR2_DATA_REPRESENTATION}, fastdds::dds::INVALID_QOS_POLICY_ID}, - { {DataRepresentationId::XCDR_DATA_REPRESENTATION}, {DataRepresentationId::XCDR2_DATA_REPRESENTATION}, + { {fastdds::dds::DataRepresentationId::XCDR_DATA_REPRESENTATION}, + {fastdds::dds::DataRepresentationId::XCDR2_DATA_REPRESENTATION}, + fastdds::dds::DATAREPRESENTATION_QOS_POLICY_ID}, + { {fastdds::dds::DataRepresentationId::XCDR2_DATA_REPRESENTATION}, {}, fastdds::dds::DATAREPRESENTATION_QOS_POLICY_ID}, - { {DataRepresentationId::XCDR2_DATA_REPRESENTATION}, {}, fastdds::dds::DATAREPRESENTATION_QOS_POLICY_ID}, - { {DataRepresentationId::XCDR2_DATA_REPRESENTATION}, {DataRepresentationId::XCDR_DATA_REPRESENTATION}, + { {fastdds::dds::DataRepresentationId::XCDR2_DATA_REPRESENTATION}, + {fastdds::dds::DataRepresentationId::XCDR_DATA_REPRESENTATION}, fastdds::dds::DATAREPRESENTATION_QOS_POLICY_ID}, - { {DataRepresentationId::XCDR2_DATA_REPRESENTATION}, - {DataRepresentationId::XCDR_DATA_REPRESENTATION, DataRepresentationId::XCDR2_DATA_REPRESENTATION}, + { {fastdds::dds::DataRepresentationId::XCDR2_DATA_REPRESENTATION}, + {fastdds::dds::DataRepresentationId::XCDR_DATA_REPRESENTATION, + fastdds::dds::DataRepresentationId::XCDR2_DATA_REPRESENTATION}, fastdds::dds::INVALID_QOS_POLICY_ID}, - { {DataRepresentationId::XCDR2_DATA_REPRESENTATION}, {DataRepresentationId::XCDR2_DATA_REPRESENTATION}, + { {fastdds::dds::DataRepresentationId::XCDR2_DATA_REPRESENTATION}, + {fastdds::dds::DataRepresentationId::XCDR2_DATA_REPRESENTATION}, fastdds::dds::INVALID_QOS_POLICY_ID} }; diff --git a/test/unittest/rtps/discovery/PDPTests.cpp b/test/unittest/rtps/discovery/PDPTests.cpp index 67321b3cd97..a8ee4a35800 100644 --- a/test/unittest/rtps/discovery/PDPTests.cpp +++ b/test/unittest/rtps/discovery/PDPTests.cpp @@ -13,12 +13,13 @@ // limitations under the License. #include -#include #include +#include #include +#include + #include #include -#include #include #include @@ -27,10 +28,10 @@ #include #include #include +#include +#include #include #include -#include -#include #include #include @@ -262,17 +263,6 @@ class Listener : public eprosima::fastdds::dds::DomainParticipantListener { } - void on_participant_discovery( - fastdds::dds::DomainParticipant* participant, - fastrtps::rtps::ParticipantDiscoveryInfo&& /*info*/) override - { - if (std::find(p_matched_.begin(), p_matched_.end(), participant->guid()) == p_matched_.end()) - { - matched++; - p_matched_.push_back(participant->guid()); - } - } - void on_participant_discovery( fastdds::dds::DomainParticipant* participant, fastrtps::rtps::ParticipantDiscoveryInfo&& /*info*/, diff --git a/test/unittest/rtps/history/ReaderHistoryTests.cpp b/test/unittest/rtps/history/ReaderHistoryTests.cpp index 9bfad247506..40d2eb6a0e2 100644 --- a/test/unittest/rtps/history/ReaderHistoryTests.cpp +++ b/test/unittest/rtps/history/ReaderHistoryTests.cpp @@ -19,8 +19,8 @@ #include #include -#include -#include +#include +#include #include #include diff --git a/test/unittest/rtps/network/CMakeLists.txt b/test/unittest/rtps/network/CMakeLists.txt index 429a2d5e05c..4f00d2753ac 100644 --- a/test/unittest/rtps/network/CMakeLists.txt +++ b/test/unittest/rtps/network/CMakeLists.txt @@ -55,7 +55,6 @@ set(NETWORKFACTORYTESTS_SOURCE ${PROJECT_SOURCE_DIR}/src/cpp/utils/IPFinder.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/IPLocator.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/md5.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/utils/System.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/SystemInfo.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/TimedConditionVariable.cpp ) diff --git a/test/unittest/rtps/network/NetworkFactoryTests.cpp b/test/unittest/rtps/network/NetworkFactoryTests.cpp index 536547d872e..ab33018a921 100644 --- a/test/unittest/rtps/network/NetworkFactoryTests.cpp +++ b/test/unittest/rtps/network/NetworkFactoryTests.cpp @@ -17,10 +17,10 @@ #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include @@ -65,7 +65,7 @@ TEST_F(NetworkTests, build_sender_resource_returns_send_resource_for_a_kind_comp int ArbitraryKind = 1; HELPER_RegisterTransportWithKindAndChannels(ArbitraryKind, 10); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t kindCompatibleLocator; kindCompatibleLocator.kind = ArbitraryKind; @@ -121,7 +121,7 @@ TEST_F(NetworkTests, build_sender_resource_returns_multiple_resources_if_multipl HELPER_RegisterTransportWithKindAndChannels(2, 10); HELPER_RegisterTransportWithKindAndChannels(2, 10); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t locatorCompatibleWithTwoTransports; locatorCompatibleWithTwoTransports.kind = 2; @@ -223,7 +223,7 @@ TEST_F(NetworkTests, BuildSenderResources_returns_empty_vector_if_no_registered_ mockTransportDescriptor.maximumChannels = 10; networkFactoryUnderTest.RegisterTransport(mockTransportDescriptor); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t locatorOfDifferentKind; locatorOfDifferentKind.kind = 2; @@ -242,7 +242,7 @@ TEST_F(NetworkTests, BuildSenderResources_returns_empty_vector_if_all_compatible // Given int ArbitraryKind = 1; HELPER_RegisterTransportWithKindAndChannels(ArbitraryKind, 10); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t locator; locator.kind = ArbitraryKind; @@ -288,7 +288,7 @@ TEST_F(NetworkTests, A_receiver_resource_accurately_reports_whether_it_supports_ // Given int ArbitraryKind = 1; HELPER_RegisterTransportWithKindAndChannels(ArbitraryKind, 10); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t locator; locator.kind = ArbitraryKind; ASSERT_TRUE(networkFactoryUnderTest.build_send_resources(send_resource_list, locator)); @@ -651,7 +651,7 @@ TEST_F(NetworkTests, LocatorShrink) fill_blackbox_locators_test_cases(test_cases); NetworkFactory f{pattr}; - UDPv4TransportDescriptor udpv4; + eprosima::fastdds::rtps::UDPv4TransportDescriptor udpv4; f.RegisterTransport(&udpv4); // TODO: Register more transports diff --git a/test/unittest/rtps/network/mock/MockTransport.cpp b/test/unittest/rtps/network/mock/MockTransport.cpp index 0520a98b63e..f7a0d6bed62 100644 --- a/test/unittest/rtps/network/mock/MockTransport.cpp +++ b/test/unittest/rtps/network/mock/MockTransport.cpp @@ -75,7 +75,7 @@ bool MockTransport::is_locator_allowed( } bool MockTransport::OpenOutputChannel( - SendResourceList& send_resource_list, + fastdds::rtps::SendResourceList& send_resource_list, const Locator_t& locator) { if (!IsLocatorSupported(locator)) @@ -98,7 +98,7 @@ bool MockTransport::OpenOutputChannel( bool MockTransport::OpenInputChannel( const Locator_t& locator, - TransportReceiverInterface*, + fastdds::rtps::TransportReceiverInterface*, uint32_t) { mockOpenInputChannels.push_back(locator.port); diff --git a/test/unittest/rtps/network/mock/MockTransport.h b/test/unittest/rtps/network/mock/MockTransport.h index cf575acd6d3..1d363e55d6c 100644 --- a/test/unittest/rtps/network/mock/MockTransport.h +++ b/test/unittest/rtps/network/mock/MockTransport.h @@ -15,11 +15,14 @@ #ifndef MOCK_TRANSPORT_H #define MOCK_TRANSPORT_H -#include -#include #include #include +#include +#include +#include +#include + namespace eprosima { namespace fastrtps { namespace rtps { @@ -47,7 +50,7 @@ class MockSenderResource : public SenderResource Locator_t locator_; }; -class MockTransport : public TransportInterface +class MockTransport : public fastdds::rtps::TransportInterface { public: @@ -67,12 +70,12 @@ class MockTransport : public TransportInterface const Locator_t&) const override; bool OpenOutputChannel( - SendResourceList& sender_resource_list, + fastdds::rtps::SendResourceList& sender_resource_list, const Locator_t&) override; bool OpenInputChannel( const Locator_t&, - TransportReceiverInterface*, + fastdds::rtps::TransportReceiverInterface*, uint32_t) override; bool CloseInputChannel( @@ -118,7 +121,7 @@ class MockTransport : public TransportInterface return false; } - TransportDescriptorInterface* get_configuration() override + fastdds::rtps::TransportDescriptorInterface* get_configuration() override { return nullptr; } @@ -224,7 +227,7 @@ class MockTransport : public TransportInterface static std::vector mockTransportInstances; }; -class MockTransportDescriptor : public SocketTransportDescriptor +class MockTransportDescriptor : public fastdds::rtps::SocketTransportDescriptor { public: @@ -235,7 +238,7 @@ class MockTransportDescriptor : public SocketTransportDescriptor int maximumChannels; int supportedKind; - TransportInterface* create_transport() const override + fastdds::rtps::TransportInterface* create_transport() const override { return new MockTransport(*this); } diff --git a/test/unittest/rtps/reader/WriterProxyAcknackTests.cpp b/test/unittest/rtps/reader/WriterProxyAcknackTests.cpp index b216494eff2..e3a203f670d 100644 --- a/test/unittest/rtps/reader/WriterProxyAcknackTests.cpp +++ b/test/unittest/rtps/reader/WriterProxyAcknackTests.cpp @@ -13,19 +13,21 @@ // limitations under the License. #include +#include + #include #include -#include #define TEST_FRIENDS \ FRIEND_TEST(WriterProxyAcknackTests, AcknackBackoff); -#include +#include +#include +#include +#include + #include -#include -#include -#include -#include +#include #include diff --git a/test/unittest/rtps/reader/WriterProxyStopTest.cpp b/test/unittest/rtps/reader/WriterProxyStopTest.cpp index f587984e7ee..038382f0894 100644 --- a/test/unittest/rtps/reader/WriterProxyStopTest.cpp +++ b/test/unittest/rtps/reader/WriterProxyStopTest.cpp @@ -13,16 +13,18 @@ // limitations under the License. #include + #include #include -#include +#include +#include +#include +#include +#include + #include -#include -#include -#include -#include -#include +#include #include diff --git a/test/unittest/rtps/reader/WriterProxyTests.cpp b/test/unittest/rtps/reader/WriterProxyTests.cpp index 7d7311fdcba..649db33f020 100644 --- a/test/unittest/rtps/reader/WriterProxyTests.cpp +++ b/test/unittest/rtps/reader/WriterProxyTests.cpp @@ -21,12 +21,13 @@ FRIEND_TEST(WriterProxyTests, ReceivedChangeSet); \ FRIEND_TEST(WriterProxyTests, IrrelevantChangeSet); -#include +#include +#include +#include +#include + #include -#include -#include -#include -#include +#include #include diff --git a/test/unittest/rtps/resources/timedevent/TimedEventTests.cpp b/test/unittest/rtps/resources/timedevent/TimedEventTests.cpp index 258c629bc4f..62e11d28994 100644 --- a/test/unittest/rtps/resources/timedevent/TimedEventTests.cpp +++ b/test/unittest/rtps/resources/timedevent/TimedEventTests.cpp @@ -12,12 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "mock/MockEvent.h" -#include -#include #include +#include + #include +#include + +#include "mock/MockEvent.h" + class TimedEventEnvironment : public ::testing::Environment { public: diff --git a/test/unittest/rtps/resources/timedevent/mock/MockEvent.h b/test/unittest/rtps/resources/timedevent/mock/MockEvent.h index 16ec04b6f35..dc00803d984 100644 --- a/test/unittest/rtps/resources/timedevent/mock/MockEvent.h +++ b/test/unittest/rtps/resources/timedevent/mock/MockEvent.h @@ -15,13 +15,14 @@ #ifndef _TEST_RTPS_RESOURCES_TIMEDEVENT_MOCKEVENT_H_ #define _TEST_RTPS_RESOURCES_TIMEDEVENT_MOCKEVENT_H_ -#include - #include #include -#include #include +#include + +#include + class MockEvent { public: diff --git a/test/unittest/rtps/security/SecurityTests.hpp b/test/unittest/rtps/security/SecurityTests.hpp index 852cd82145e..35f657d2174 100644 --- a/test/unittest/rtps/security/SecurityTests.hpp +++ b/test/unittest/rtps/security/SecurityTests.hpp @@ -15,23 +15,24 @@ #ifndef __TEST_UNITTEST_RTPS_SECURITY_SECURITYTESTS_HPP__ #define __TEST_UNITTEST_RTPS_SECURITY_SECURITYTESTS_HPP__ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include - -#include +#include using namespace eprosima::fastrtps::rtps; using namespace eprosima::fastrtps::rtps::security; diff --git a/test/unittest/rtps/writer/CMakeLists.txt b/test/unittest/rtps/writer/CMakeLists.txt index bcc2f523a80..406f52cf7c9 100644 --- a/test/unittest/rtps/writer/CMakeLists.txt +++ b/test/unittest/rtps/writer/CMakeLists.txt @@ -121,7 +121,7 @@ if(NOT QNX) ) target_include_directories(RTPSWriterTests PRIVATE ${Asio_INCLUDE_DIR}) - target_link_libraries(RTPSWriterTests fastcdr fastrtps foonathan_memory + target_link_libraries(RTPSWriterTests fastcdr fastdds foonathan_memory GTest::gmock ${CMAKE_DL_LIBS}) gtest_discover_tests(RTPSWriterTests) diff --git a/test/unittest/rtps/writer/LivelinessManagerTests.cpp b/test/unittest/rtps/writer/LivelinessManagerTests.cpp index 03ed08ababb..d23eddfec89 100644 --- a/test/unittest/rtps/writer/LivelinessManagerTests.cpp +++ b/test/unittest/rtps/writer/LivelinessManagerTests.cpp @@ -12,17 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include +#include +#include -#include -#include -#include #include -#include -#include +#include #include +#include +#include +#include + class LivelinessManagerTests : public ::testing::Test { public: @@ -56,7 +56,7 @@ class LivelinessManagerTests : public ::testing::Test void liveliness_changed( eprosima::fastrtps::rtps::GUID_t guid, - const eprosima::fastrtps::LivelinessQosPolicyKind&, + const eprosima::fastdds::dds::LivelinessQosPolicyKind&, const eprosima::fastrtps::Duration_t&, int alive_change, int not_alive_change) @@ -128,19 +128,20 @@ TEST_F(LivelinessManagerTests, WriterCanAlwaysBeAdded) // Writers with same Guid, liveliness kind and lease duration cannot be added - EXPECT_EQ(liveliness_manager.add_writer(guid, AUTOMATIC_LIVELINESS_QOS, Duration_t(1)), true); + EXPECT_EQ(liveliness_manager.add_writer(guid, fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(1)), true); // Same guid and different liveliness kind can be added - EXPECT_EQ(liveliness_manager.add_writer(guid, MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(1)), true); - EXPECT_EQ(liveliness_manager.add_writer(guid, MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1)), true); + EXPECT_EQ(liveliness_manager.add_writer(guid, fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t( + 1)), true); + EXPECT_EQ(liveliness_manager.add_writer(guid, fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1)), true); // Same guid and different lease duration can be added - EXPECT_EQ(liveliness_manager.add_writer(guid, AUTOMATIC_LIVELINESS_QOS, Duration_t(2)), true); - EXPECT_EQ(liveliness_manager.add_writer(guid, AUTOMATIC_LIVELINESS_QOS, Duration_t(3)), true); - EXPECT_EQ(liveliness_manager.add_writer(guid, AUTOMATIC_LIVELINESS_QOS, Duration_t(4)), true); + EXPECT_EQ(liveliness_manager.add_writer(guid, fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(2)), true); + EXPECT_EQ(liveliness_manager.add_writer(guid, fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(3)), true); + EXPECT_EQ(liveliness_manager.add_writer(guid, fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(4)), true); // Same guid, same kind, and same lease duration can also be added - EXPECT_EQ(liveliness_manager.add_writer(guid, AUTOMATIC_LIVELINESS_QOS, Duration_t(1)), true); + EXPECT_EQ(liveliness_manager.add_writer(guid, fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(1)), true); } TEST_F(LivelinessManagerTests, WriterCannotBeRemovedTwice) @@ -153,17 +154,22 @@ TEST_F(LivelinessManagerTests, WriterCannotBeRemovedTwice) guidP.value[0] = 1; GUID_t guid(guidP, 0); - EXPECT_EQ(liveliness_manager.add_writer(guid, AUTOMATIC_LIVELINESS_QOS, Duration_t(1)), true); - EXPECT_EQ(liveliness_manager.remove_writer(guid, AUTOMATIC_LIVELINESS_QOS, Duration_t(1)), true); - EXPECT_EQ(liveliness_manager.remove_writer(guid, AUTOMATIC_LIVELINESS_QOS, Duration_t(1)), false); - - EXPECT_EQ(liveliness_manager.add_writer(guid, MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(1)), true); - EXPECT_EQ(liveliness_manager.remove_writer(guid, MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(1)), true); - EXPECT_EQ(liveliness_manager.remove_writer(guid, MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(1)), false); - - EXPECT_EQ(liveliness_manager.add_writer(guid, MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1)), true); - EXPECT_EQ(liveliness_manager.remove_writer(guid, MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1)), true); - EXPECT_EQ(liveliness_manager.remove_writer(guid, MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1)), false); + EXPECT_EQ(liveliness_manager.add_writer(guid, fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(1)), true); + EXPECT_EQ(liveliness_manager.remove_writer(guid, fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(1)), true); + EXPECT_EQ(liveliness_manager.remove_writer(guid, fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(1)), false); + + EXPECT_EQ(liveliness_manager.add_writer(guid, fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t( + 1)), true); + EXPECT_EQ(liveliness_manager.remove_writer(guid, fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t( + 1)), true); + EXPECT_EQ(liveliness_manager.remove_writer(guid, fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t( + 1)), false); + + EXPECT_EQ(liveliness_manager.add_writer(guid, fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1)), true); + EXPECT_EQ(liveliness_manager.remove_writer(guid, fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1)), + true); + EXPECT_EQ(liveliness_manager.remove_writer(guid, fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1)), + false); } //! Tests that the assert_liveliness() method that takes liveliness kind as argument sets the alive state and time @@ -177,15 +183,15 @@ TEST_F(LivelinessManagerTests, AssertLivelinessByKind) GuidPrefix_t guidP; guidP.value[0] = 1; - liveliness_manager.add_writer(GUID_t(guidP, 1), AUTOMATIC_LIVELINESS_QOS, Duration_t(10)); - liveliness_manager.add_writer(GUID_t(guidP, 2), AUTOMATIC_LIVELINESS_QOS, Duration_t(10)); - liveliness_manager.add_writer(GUID_t(guidP, 3), MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(10)); - liveliness_manager.add_writer(GUID_t(guidP, 4), MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(10)); - liveliness_manager.add_writer(GUID_t(guidP, 5), MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(10)); - liveliness_manager.add_writer(GUID_t(guidP, 6), MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(10)); + liveliness_manager.add_writer(GUID_t(guidP, 1), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(10)); + liveliness_manager.add_writer(GUID_t(guidP, 2), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(10)); + liveliness_manager.add_writer(GUID_t(guidP, 3), fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(10)); + liveliness_manager.add_writer(GUID_t(guidP, 4), fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(10)); + liveliness_manager.add_writer(GUID_t(guidP, 5), fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(10)); + liveliness_manager.add_writer(GUID_t(guidP, 6), fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(10)); // Assert liveliness of automatic writers (the rest should be unchanged) - EXPECT_TRUE(liveliness_manager.assert_liveliness(AUTOMATIC_LIVELINESS_QOS, guidP)); + EXPECT_TRUE(liveliness_manager.assert_liveliness(fastdds::dds::AUTOMATIC_LIVELINESS_QOS, guidP)); auto liveliness_data = liveliness_manager.get_liveliness_data(); EXPECT_EQ(liveliness_data[0].status, LivelinessData::WriterStatus::ALIVE); EXPECT_EQ(liveliness_data[1].status, LivelinessData::WriterStatus::ALIVE); @@ -195,7 +201,7 @@ TEST_F(LivelinessManagerTests, AssertLivelinessByKind) EXPECT_EQ(liveliness_data[5].status, LivelinessData::WriterStatus::NOT_ASSERTED); // Assert liveliness of manual by participant writers - EXPECT_TRUE(liveliness_manager.assert_liveliness(MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, guidP)); + EXPECT_TRUE(liveliness_manager.assert_liveliness(fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, guidP)); liveliness_data = liveliness_manager.get_liveliness_data(); EXPECT_EQ(liveliness_data[0].status, LivelinessData::WriterStatus::ALIVE); EXPECT_EQ(liveliness_data[1].status, LivelinessData::WriterStatus::ALIVE); @@ -205,7 +211,7 @@ TEST_F(LivelinessManagerTests, AssertLivelinessByKind) EXPECT_EQ(liveliness_data[5].status, LivelinessData::WriterStatus::NOT_ASSERTED); // Assert liveliness of manual by topic writers - EXPECT_TRUE(liveliness_manager.assert_liveliness(MANUAL_BY_TOPIC_LIVELINESS_QOS, guidP)); + EXPECT_TRUE(liveliness_manager.assert_liveliness(fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, guidP)); liveliness_data = liveliness_manager.get_liveliness_data(); EXPECT_EQ(liveliness_data[0].status, LivelinessData::WriterStatus::ALIVE); EXPECT_EQ(liveliness_data[1].status, LivelinessData::WriterStatus::ALIVE); @@ -233,17 +239,17 @@ TEST_F(LivelinessManagerTests, AssertLivelinessByWriter) GuidPrefix_t guidP; guidP.value[0] = 1; - liveliness_manager.add_writer(GUID_t(guidP, 1), AUTOMATIC_LIVELINESS_QOS, Duration_t(1)); - liveliness_manager.add_writer(GUID_t(guidP, 2), AUTOMATIC_LIVELINESS_QOS, Duration_t(1)); - liveliness_manager.add_writer(GUID_t(guidP, 3), MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(1)); - liveliness_manager.add_writer(GUID_t(guidP, 4), MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(1)); - liveliness_manager.add_writer(GUID_t(guidP, 5), MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1)); - liveliness_manager.add_writer(GUID_t(guidP, 6), MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1)); + liveliness_manager.add_writer(GUID_t(guidP, 1), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(1)); + liveliness_manager.add_writer(GUID_t(guidP, 2), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(1)); + liveliness_manager.add_writer(GUID_t(guidP, 3), fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(1)); + liveliness_manager.add_writer(GUID_t(guidP, 4), fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(1)); + liveliness_manager.add_writer(GUID_t(guidP, 5), fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1)); + liveliness_manager.add_writer(GUID_t(guidP, 6), fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1)); // If a manual by topic writer is asserted the other writers are unchanged EXPECT_TRUE(liveliness_manager.assert_liveliness( GUID_t(guidP, 6), - MANUAL_BY_TOPIC_LIVELINESS_QOS, + fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1))); auto liveliness_data = liveliness_manager.get_liveliness_data(); EXPECT_EQ(liveliness_data[0].status, LivelinessData::WriterStatus::NOT_ASSERTED); @@ -255,7 +261,7 @@ TEST_F(LivelinessManagerTests, AssertLivelinessByWriter) EXPECT_TRUE(liveliness_manager.assert_liveliness( GUID_t(guidP, 5), - MANUAL_BY_TOPIC_LIVELINESS_QOS, + fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(1))); liveliness_data = liveliness_manager.get_liveliness_data(); EXPECT_EQ(liveliness_data[0].status, LivelinessData::WriterStatus::NOT_ASSERTED); @@ -268,7 +274,7 @@ TEST_F(LivelinessManagerTests, AssertLivelinessByWriter) // If an automatic writer is asserted all automatic writers are asserted as well EXPECT_TRUE(liveliness_manager.assert_liveliness( GUID_t(guidP, 1), - AUTOMATIC_LIVELINESS_QOS, + fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(1))); liveliness_data = liveliness_manager.get_liveliness_data(); EXPECT_EQ(liveliness_data[0].status, LivelinessData::WriterStatus::ALIVE); @@ -281,7 +287,7 @@ TEST_F(LivelinessManagerTests, AssertLivelinessByWriter) // If a manual by participant writer is asserted all manual by participant writers are asserted as well EXPECT_TRUE(liveliness_manager.assert_liveliness( GUID_t(guidP, 4), - MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, + fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(1))); liveliness_data = liveliness_manager.get_liveliness_data(); EXPECT_EQ(liveliness_data[0].status, LivelinessData::WriterStatus::ALIVE); @@ -317,11 +323,11 @@ TEST_F(LivelinessManagerTests, TimerExpired_Automatic) GuidPrefix_t guidP; guidP.value[0] = 1; - liveliness_manager.add_writer(GUID_t(guidP, 1), AUTOMATIC_LIVELINESS_QOS, Duration_t(0.1)); - liveliness_manager.add_writer(GUID_t(guidP, 2), AUTOMATIC_LIVELINESS_QOS, Duration_t(0.5)); + liveliness_manager.add_writer(GUID_t(guidP, 1), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(0.1)); + liveliness_manager.add_writer(GUID_t(guidP, 2), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(0.5)); // Assert liveliness - liveliness_manager.assert_liveliness(GUID_t(guidP, 2), AUTOMATIC_LIVELINESS_QOS, Duration_t(0.5)); + liveliness_manager.assert_liveliness(GUID_t(guidP, 2), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(0.5)); num_writers_recovered = 0u; // Wait so that first writer loses liveliness @@ -333,7 +339,7 @@ TEST_F(LivelinessManagerTests, TimerExpired_Automatic) EXPECT_EQ(writer_losing_liveliness, GUID_t(guidP, 2)); // Assert first writer - liveliness_manager.assert_liveliness(GUID_t(guidP, 1), AUTOMATIC_LIVELINESS_QOS, Duration_t(0.1)); + liveliness_manager.assert_liveliness(GUID_t(guidP, 1), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(0.1)); wait_liveliness_recovered(2u); EXPECT_EQ(num_writers_recovered, 2u); } @@ -356,11 +362,15 @@ TEST_F(LivelinessManagerTests, TimerExpired_ManualByParticipant) GuidPrefix_t guidP; guidP.value[0] = 1; - liveliness_manager.add_writer(GUID_t(guidP, 1), MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(0.1)); - liveliness_manager.add_writer(GUID_t(guidP, 2), MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(0.5)); + liveliness_manager.add_writer(GUID_t(guidP, 1), fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, + Duration_t(0.1)); + liveliness_manager.add_writer(GUID_t(guidP, 2), fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, + Duration_t(0.5)); // Assert liveliness - liveliness_manager.assert_liveliness(GUID_t(guidP, 2), MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(0.5)); + liveliness_manager.assert_liveliness(GUID_t(guidP, + 2), fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, + Duration_t(0.5)); num_writers_recovered = 0u; // Wait so that first writer loses liveliness @@ -374,7 +384,9 @@ TEST_F(LivelinessManagerTests, TimerExpired_ManualByParticipant) EXPECT_EQ(num_writers_lost, 2u); // Assert first writer - liveliness_manager.assert_liveliness(GUID_t(guidP, 1), MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, Duration_t(0.1)); + liveliness_manager.assert_liveliness(GUID_t(guidP, + 1), fastdds::dds::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS, + Duration_t(0.1)); wait_liveliness_recovered(2u); EXPECT_EQ(num_writers_recovered, 2u); } @@ -397,11 +409,12 @@ TEST_F(LivelinessManagerTests, TimerExpired_ManualByTopic) GuidPrefix_t guidP; guidP.value[0] = 1; - liveliness_manager.add_writer(GUID_t(guidP, 1), MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(0.1)); - liveliness_manager.add_writer(GUID_t(guidP, 2), MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(0.2)); + liveliness_manager.add_writer(GUID_t(guidP, 1), fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(0.1)); + liveliness_manager.add_writer(GUID_t(guidP, 2), fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(0.2)); // Assert first writer - liveliness_manager.assert_liveliness(GUID_t(guidP, 1), MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(0.1)); + liveliness_manager.assert_liveliness(GUID_t(guidP, 1), fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, + Duration_t(0.1)); wait_liveliness_recovered(1u); // Wait so that first writer loses liveliness @@ -415,7 +428,8 @@ TEST_F(LivelinessManagerTests, TimerExpired_ManualByTopic) EXPECT_EQ(num_writers_lost, 1u); // Assert second writer - liveliness_manager.assert_liveliness(GUID_t(guidP, 2), MANUAL_BY_TOPIC_LIVELINESS_QOS, Duration_t(0.2)); + liveliness_manager.assert_liveliness(GUID_t(guidP, 2), fastdds::dds::MANUAL_BY_TOPIC_LIVELINESS_QOS, + Duration_t(0.2)); wait_liveliness_recovered(2u); num_writers_lost = 0u; @@ -443,11 +457,11 @@ TEST_F(LivelinessManagerTests, TimerOwnerCalculation) GuidPrefix_t guidP; guidP.value[0] = 1; - liveliness_manager.add_writer(GUID_t(guidP, 1), AUTOMATIC_LIVELINESS_QOS, Duration_t(100 * 1e-3)); - liveliness_manager.add_writer(GUID_t(guidP, 2), AUTOMATIC_LIVELINESS_QOS, Duration_t(1000 * 1e-3)); - liveliness_manager.add_writer(GUID_t(guidP, 3), AUTOMATIC_LIVELINESS_QOS, Duration_t(500 * 1e-3)); + liveliness_manager.add_writer(GUID_t(guidP, 1), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(100 * 1e-3)); + liveliness_manager.add_writer(GUID_t(guidP, 2), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(1000 * 1e-3)); + liveliness_manager.add_writer(GUID_t(guidP, 3), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(500 * 1e-3)); - liveliness_manager.assert_liveliness(AUTOMATIC_LIVELINESS_QOS, guidP); + liveliness_manager.assert_liveliness(fastdds::dds::AUTOMATIC_LIVELINESS_QOS, guidP); wait_liveliness_lost(1u); EXPECT_EQ(writer_losing_liveliness, GUID_t(guidP, 1)); @@ -480,11 +494,11 @@ TEST_F(LivelinessManagerTests, TimerOwnerRemoved) GuidPrefix_t guidP; guidP.value[0] = 1; - liveliness_manager.add_writer(GUID_t(guidP, 1), AUTOMATIC_LIVELINESS_QOS, Duration_t(0.5)); - liveliness_manager.add_writer(GUID_t(guidP, 2), AUTOMATIC_LIVELINESS_QOS, Duration_t(1)); + liveliness_manager.add_writer(GUID_t(guidP, 1), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(0.5)); + liveliness_manager.add_writer(GUID_t(guidP, 2), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(1)); - liveliness_manager.assert_liveliness(GUID_t(guidP, 1), AUTOMATIC_LIVELINESS_QOS, Duration_t(0.5)); - liveliness_manager.remove_writer(GUID_t(guidP, 1), AUTOMATIC_LIVELINESS_QOS, Duration_t(0.5)); + liveliness_manager.assert_liveliness(GUID_t(guidP, 1), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(0.5)); + liveliness_manager.remove_writer(GUID_t(guidP, 1), fastdds::dds::AUTOMATIC_LIVELINESS_QOS, Duration_t(0.5)); wait_liveliness_lost(1u); EXPECT_EQ(writer_losing_liveliness, GUID_t(guidP, 2)); diff --git a/test/unittest/rtps/writer/ReaderProxyTests.cpp b/test/unittest/rtps/writer/ReaderProxyTests.cpp index bb6d0bee937..e92d8473710 100644 --- a/test/unittest/rtps/writer/ReaderProxyTests.cpp +++ b/test/unittest/rtps/writer/ReaderProxyTests.cpp @@ -15,8 +15,9 @@ #include #include -#include -#include +#include +#include + #include //using namespace eprosima::fastrtps::rtps; @@ -128,7 +129,7 @@ TEST(ReaderProxyTests, requested_changes_set_test) RTPSGapBuilder gap_builder(message_group); ReaderProxyData reader_attributes(0, 0); - reader_attributes.m_qos.m_reliability.kind = RELIABLE_RELIABILITY_QOS; + reader_attributes.m_qos.m_reliability.kind = fastdds::dds::RELIABLE_RELIABILITY_QOS; rproxy.start(reader_attributes); @@ -188,7 +189,7 @@ TEST(ReaderProxyTests, process_nack_frag_single_fragment_different_windows_test) RTPSGapBuilder gap_builder(message_group); ReaderProxyData reader_attributes(0, 0); - reader_attributes.m_qos.m_reliability.kind = RELIABLE_RELIABILITY_QOS; + reader_attributes.m_qos.m_reliability.kind = fastdds::dds::RELIABLE_RELIABILITY_QOS; rproxy.start(reader_attributes); ChangeForReader_t change(&seq); @@ -257,7 +258,7 @@ TEST(ReaderProxyTests, process_nack_frag_multiple_fragments_different_windows_te RTPSGapBuilder gap_builder(message_group); ReaderProxyData reader_attributes(0, 0); - reader_attributes.m_qos.m_reliability.kind = RELIABLE_RELIABILITY_QOS; + reader_attributes.m_qos.m_reliability.kind = fastdds::dds::RELIABLE_RELIABILITY_QOS; rproxy.start(reader_attributes); ChangeForReader_t change(&seq); @@ -346,7 +347,7 @@ TEST(ReaderProxyTests, has_been_delivered_test) seq2.sequenceNumber = {0, 2}; ReaderProxyData reader_attributes(0, 0); - reader_attributes.m_qos.m_reliability.kind = RELIABLE_RELIABILITY_QOS; + reader_attributes.m_qos.m_reliability.kind = fastdds::dds::RELIABLE_RELIABILITY_QOS; rproxy.start(reader_attributes); auto expect_result = [&rproxy](SequenceNumber_t seq, bool delivered, bool should_be_found) @@ -392,7 +393,7 @@ TEST(ReaderProxyTests, acknack_count) ReaderProxy rproxy(w_times, alloc, &writer_mock); ReaderProxyData reader_attributes(0, 0); - reader_attributes.m_qos.m_reliability.kind = RELIABLE_RELIABILITY_QOS; + reader_attributes.m_qos.m_reliability.kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; rproxy.start(reader_attributes); // Check that the initial acknack count is 0. diff --git a/test/unittest/security/accesscontrol/AccessControlTests.cpp b/test/unittest/security/accesscontrol/AccessControlTests.cpp index 3cd39972e31..beb97e9269d 100644 --- a/test/unittest/security/accesscontrol/AccessControlTests.cpp +++ b/test/unittest/security/accesscontrol/AccessControlTests.cpp @@ -12,22 +12,21 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include +#include + +#include -#include -#include -#include +#include +#include +#include +#include -#include +#include +#include #include -#include #include -#include -#include - -#include - -#include +#include +#include using namespace eprosima::fastrtps::rtps; using namespace eprosima::fastrtps::rtps::security; diff --git a/test/unittest/security/authentication/AuthenticationPluginTests.hpp b/test/unittest/security/authentication/AuthenticationPluginTests.hpp index 95087dd4d85..31482ae88aa 100644 --- a/test/unittest/security/authentication/AuthenticationPluginTests.hpp +++ b/test/unittest/security/authentication/AuthenticationPluginTests.hpp @@ -15,17 +15,16 @@ #ifndef _UNITTEST_SECURITY_AUTHENTICATION_AUTHENTICATIONPLUGINTESTS_HPP_ #define _UNITTEST_SECURITY_AUTHENTICATION_AUTHENTICATIONPLUGINTESTS_HPP_ -#include -#include +#include // Include first necessary mocks -#include -#include -#include - #include +#include +#include +#include -#include +#include +#include class AuthenticationPluginTest : public ::testing::Test { diff --git a/test/unittest/security/authentication/BuiltinPKIDHTests.cpp b/test/unittest/security/authentication/BuiltinPKIDHTests.cpp index 14a8d2301ab..37622e782f1 100644 --- a/test/unittest/security/authentication/BuiltinPKIDHTests.cpp +++ b/test/unittest/security/authentication/BuiltinPKIDHTests.cpp @@ -16,13 +16,15 @@ // suppresses the warnings until true OpenSSL 3.0 APIs can be used. #define OPENSSL_API_COMPAT 10101 -#include "AuthenticationPluginTests.hpp" +#include +#include +#include -#include -#include -#include +#include -#include +#include "AuthenticationPluginTests.hpp" +#include +#include #if OPENSSL_VERSION_NUMBER >= 0x10100000L #define IS_OPENSSL_1_1 1 @@ -30,9 +32,6 @@ #define IS_OPENSSL_1_1 0 #endif // if OPENSSL_VERSION_NUMBER >= 0x10100000L -#include -#include - using namespace eprosima::fastrtps::rtps; using namespace eprosima::fastrtps::rtps::security; diff --git a/test/unittest/security/cryptography/CryptographyPluginTests.hpp b/test/unittest/security/cryptography/CryptographyPluginTests.hpp index 8e7f7487572..43b3a109cee 100644 --- a/test/unittest/security/cryptography/CryptographyPluginTests.hpp +++ b/test/unittest/security/cryptography/CryptographyPluginTests.hpp @@ -15,18 +15,19 @@ #ifndef _UNITTEST_SECURITY_CRYPTOGRAPHY_CRYPTOGRAPHYPLUGINTESTS_HPP_ #define _UNITTEST_SECURITY_CRYPTOGRAPHY_CRYPTOGRAPHYPLUGINTESTS_HPP_ -#include -#include -#include -#include - -#include -#include +#include +#include #include #include -#include -#include + +#include + +#include +#include +#include +#include +#include class CryptographyPluginTest : public ::testing::Test { diff --git a/test/unittest/statistics/dds/CMakeLists.txt b/test/unittest/statistics/dds/CMakeLists.txt index 511a6f821fd..e733018d165 100644 --- a/test/unittest/statistics/dds/CMakeLists.txt +++ b/test/unittest/statistics/dds/CMakeLists.txt @@ -39,7 +39,7 @@ target_compile_definitions(StatisticsDomainParticipantTests PRIVATE ) target_include_directories(StatisticsDomainParticipantTests PRIVATE ${PROJECT_SOURCE_DIR}/include ${PROJECT_BINARY_DIR}/include ${PROJECT_SOURCE_DIR}/src/cpp) -target_link_libraries(StatisticsDomainParticipantTests fastrtps fastcdr GTest::gtest) +target_link_libraries(StatisticsDomainParticipantTests fastdds fastcdr GTest::gtest) gtest_discover_tests(StatisticsDomainParticipantTests) ## StatisticsQosTests @@ -63,7 +63,7 @@ target_compile_definitions(StatisticsQosTests PRIVATE BOOST_ASIO_STANDALONE ASIO ) target_include_directories(StatisticsQosTests PRIVATE ${PROJECT_SOURCE_DIR}/include ${PROJECT_BINARY_DIR}/include ${PROJECT_SOURCE_DIR}/src/cpp ${THIRDPARTY_BOOST_INCLUDE_DIR}) -target_link_libraries(StatisticsQosTests fastrtps fastcdr ${TINYXML2_LIBRARY} foonathan_memory GTest::gtest) +target_link_libraries(StatisticsQosTests fastdds fastcdr ${TINYXML2_LIBRARY} foonathan_memory GTest::gtest) gtest_discover_tests(StatisticsQosTests) ## StatisticsDomainParticipantListenerTests @@ -126,7 +126,6 @@ if (SQLITE3_SUPPORT AND FASTDDS_STATISTICS AND NOT QNX) ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeObjectFactory.cpp ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeObjectHashId.cpp ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypesBase.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/builtin/common/RPCHeadersImpl.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/builtin/typelookup/common/TypeLookupTypes.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/builtin/typelookup/TypeLookupManager.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/builtin/typelookup/TypeLookupReplyListener.cpp @@ -329,7 +328,6 @@ if (SQLITE3_SUPPORT AND FASTDDS_STATISTICS AND NOT QNX) ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeObjectFactory.cpp ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeObjectHashId.cpp ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypesBase.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/builtin/common/RPCHeadersImpl.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/builtin/typelookup/common/TypeLookupTypes.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/builtin/typelookup/TypeLookupManager.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/builtin/typelookup/TypeLookupReplyListener.cpp @@ -342,7 +340,6 @@ if (SQLITE3_SUPPORT AND FASTDDS_STATISTICS AND NOT QNX) ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/core/Entity.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/core/policy/ParameterList.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/core/policy/QosPolicyUtils.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/core/policy/QosPolicyUtils.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/domain/DomainParticipant.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/domain/DomainParticipantFactory.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/domain/qos/DomainParticipantFactoryQos.cpp @@ -490,7 +487,6 @@ if (SQLITE3_SUPPORT AND FASTDDS_STATISTICS AND NOT QNX) ${PROJECT_SOURCE_DIR}/src/cpp/statistics/rtps/monitor-service/MonitorServiceListener.cpp ${PROJECT_SOURCE_DIR}/src/cpp/statistics/rtps/reader/StatisticsReaderImpl.cpp ${PROJECT_SOURCE_DIR}/src/cpp/statistics/rtps/StatisticsBase.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/statistics/rtps/StatisticsBase.cpp ${PROJECT_SOURCE_DIR}/src/cpp/statistics/rtps/writer/StatisticsWriterImpl.cpp ${PROJECT_SOURCE_DIR}/src/cpp/statistics/types/monitorservice_types.cxx ${PROJECT_SOURCE_DIR}/src/cpp/statistics/types/monitorservice_typesPubSubTypes.cxx @@ -644,7 +640,7 @@ if (SQLITE3_SUPPORT AND FASTDDS_STATISTICS AND NOT QNX) gtest_discover_tests(StatisticsDomainParticipantMockTests) add_executable(StatisticsDomainParticipantStatusQueryableTests ${STATISTICS_DOMAINPARTICIPANT_STATUS_QUERYABLE_TESTS_SOURCE}) - target_compile_definitions(StatisticsDomainParticipantStatusQueryableTests PRIVATE FASTRTPS_NO_LIB + target_compile_definitions(StatisticsDomainParticipantStatusQueryableTests PRIVATE FASTDDS_NO_LIB BOOST_ASIO_STANDALONE ASIO_STANDALONE SQLITE_WIN32_GETVERSIONEX=0 diff --git a/test/unittest/statistics/dds/StatisticsDomainParticipantStatusQueryableTests/mock/fastdds/publisher/DataWriterImpl.hpp b/test/unittest/statistics/dds/StatisticsDomainParticipantStatusQueryableTests/mock/fastdds/publisher/DataWriterImpl.hpp index e6036a05b00..3d109619673 100644 --- a/test/unittest/statistics/dds/StatisticsDomainParticipantStatusQueryableTests/mock/fastdds/publisher/DataWriterImpl.hpp +++ b/test/unittest/statistics/dds/StatisticsDomainParticipantStatusQueryableTests/mock/fastdds/publisher/DataWriterImpl.hpp @@ -16,40 +16,34 @@ * @file DataWriterImpl.hpp */ -#ifndef _FASTRTPS_DATAWRITERIMPL_HPP_ -#define _FASTRTPS_DATAWRITERIMPL_HPP_ +#ifndef _FASTDDS_DATAWRITERIMPL_HPP_ +#define _FASTDDS_DATAWRITERIMPL_HPP_ #include #include +#include #include #include #include #include #include #include - +#include +#include #include -#include #include +#include #include #include #include #include #include - -#include -#include - #include -#include -#include - #include -#include #include - +#include namespace eprosima { namespace fastrtps { @@ -275,7 +269,7 @@ class DataWriterImpl : protected rtps::IReaderDataFilter } ReturnCode_t get_offered_deadline_missed_status( - fastrtps::OfferedDeadlineMissedStatus& status) + OfferedDeadlineMissedStatus& status) { status = deadline_missed_status_; return ReturnCode_t::RETCODE_OK; @@ -451,4 +445,4 @@ class DataWriterImpl : protected rtps::IReaderDataFilter } /* namespace fastdds */ } /* namespace eprosima */ -#endif //_FASTRTPS_DATAWRITERIMPL_HPP_ +#endif //_FASTDDS_DATAWRITERIMPL_HPP_ diff --git a/test/unittest/statistics/dds/StatisticsQosTests.cpp b/test/unittest/statistics/dds/StatisticsQosTests.cpp index d5c1f73d1f1..93d930ebe77 100644 --- a/test/unittest/statistics/dds/StatisticsQosTests.cpp +++ b/test/unittest/statistics/dds/StatisticsQosTests.cpp @@ -170,7 +170,7 @@ TEST_F(StatisticsFromXMLProfileTests, XMLConfigurationForStatisticsDataWritersQo const std::string xml = " \ \ - \ + \ \ \ \ @@ -446,7 +446,7 @@ TEST_F(StatisticsFromXMLProfileTests, XMLConfigurationForStatisticsDataWritersQo const std::string xml = " \ \ - \ + \ \ \ \ diff --git a/test/unittest/statistics/rtps/CMakeLists.txt b/test/unittest/statistics/rtps/CMakeLists.txt index a13e24cd0da..213e45996af 100644 --- a/test/unittest/statistics/rtps/CMakeLists.txt +++ b/test/unittest/statistics/rtps/CMakeLists.txt @@ -40,7 +40,7 @@ target_include_directories(RTPSStatisticsTests PRIVATE ${Asio_INCLUDE_DIR} ) -target_link_libraries(RTPSStatisticsTests fastrtps fastcdr GTest::gtest GTest::gmock) +target_link_libraries(RTPSStatisticsTests fastdds fastcdr GTest::gtest GTest::gmock) gtest_discover_tests(RTPSStatisticsTests) set(TCPTransportInterface_SOURCE @@ -138,7 +138,7 @@ set(STATISTICS_RTPS_MONITORSERVICETESTS_SOURCE add_executable(MonitorServiceTests ${STATISTICS_RTPS_MONITORSERVICETESTS_SOURCE}) -target_compile_definitions(MonitorServiceTests PRIVATE FASTRTPS_NO_LIB +target_compile_definitions(MonitorServiceTests PRIVATE FASTDDS_NO_LIB BOOST_ASIO_STANDALONE ASIO_STANDALONE $<$>,$>:__DEBUG> diff --git a/test/unittest/statistics/rtps/MonitorServiceTests.cpp b/test/unittest/statistics/rtps/MonitorServiceTests.cpp index af7852a825f..c7132bf52a0 100644 --- a/test/unittest/statistics/rtps/MonitorServiceTests.cpp +++ b/test/unittest/statistics/rtps/MonitorServiceTests.cpp @@ -80,7 +80,7 @@ class MonitorServiceTests : public ::testing::Test [&]( fastrtps::rtps::RTPSWriter*, const fastrtps::TopicAttributes&, - const fastrtps::WriterQos&)->bool + const fastdds::dds::WriterQos&)->bool { return true; }, diff --git a/test/unittest/statistics/rtps/RTPSStatisticsTests.cpp b/test/unittest/statistics/rtps/RTPSStatisticsTests.cpp index a54d4c88183..9dfa7402c32 100644 --- a/test/unittest/statistics/rtps/RTPSStatisticsTests.cpp +++ b/test/unittest/statistics/rtps/RTPSStatisticsTests.cpp @@ -14,6 +14,7 @@ #include #include + #if defined(_WIN32) #include #else @@ -36,22 +37,18 @@ #include #include #include +#include #include #include #include -#include -#include #include -#include -#include #include -#include -#include - #include #include #include +#include +#include #include #include diff --git a/test/unittest/statistics/rtps/mock/StatisticsBase/statistics/rtps/StatisticsBase.hpp b/test/unittest/statistics/rtps/mock/StatisticsBase/statistics/rtps/StatisticsBase.hpp index 8d1ee7f86de..f3630f6f42f 100644 --- a/test/unittest/statistics/rtps/mock/StatisticsBase/statistics/rtps/StatisticsBase.hpp +++ b/test/unittest/statistics/rtps/mock/StatisticsBase/statistics/rtps/StatisticsBase.hpp @@ -24,12 +24,10 @@ #include #include -#include - +#include #include - namespace eprosima { namespace fastdds { namespace statistics { diff --git a/test/unittest/statistics/rtps/mock/StatisticsBase/statistics/rtps/monitor-service/MonitorService.hpp b/test/unittest/statistics/rtps/mock/StatisticsBase/statistics/rtps/monitor-service/MonitorService.hpp index 0160eec3d28..a6d19f9fefc 100644 --- a/test/unittest/statistics/rtps/mock/StatisticsBase/statistics/rtps/monitor-service/MonitorService.hpp +++ b/test/unittest/statistics/rtps/mock/StatisticsBase/statistics/rtps/monitor-service/MonitorService.hpp @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -63,7 +64,7 @@ class MonitorService using endpoint_registrator_t = std::function; + const fastdds::dds::WriterQos&)>; MonitorService( const fastrtps::rtps::GUID_t& guid, diff --git a/test/unittest/transport/CMakeLists.txt b/test/unittest/transport/CMakeLists.txt index 9d201a3a95a..af11fe402ce 100644 --- a/test/unittest/transport/CMakeLists.txt +++ b/test/unittest/transport/CMakeLists.txt @@ -168,7 +168,6 @@ set(TCPV4TESTS_SOURCE ${PROJECT_SOURCE_DIR}/src/cpp/utils/IPFinder.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/IPLocator.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/md5.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/utils/System.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/SystemInfo.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/TimedConditionVariable.cpp ) @@ -219,7 +218,6 @@ set(TCPV6TESTS_SOURCE ${PROJECT_SOURCE_DIR}/src/cpp/utils/IPFinder.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/IPLocator.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/md5.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/utils/System.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/SystemInfo.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/TimedConditionVariable.cpp ) diff --git a/test/unittest/transport/SharedMemTests.cpp b/test/unittest/transport/SharedMemTests.cpp index 35470bf9489..255607f34e4 100644 --- a/test/unittest/transport/SharedMemTests.cpp +++ b/test/unittest/transport/SharedMemTests.cpp @@ -12,24 +12,26 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include -#include -#include -#include -#include "../../../src/cpp/rtps/transport/shared_mem/SharedMemSenderResource.hpp" -#include "../../../src/cpp/rtps/transport/shared_mem/SharedMemManager.hpp" -#include "../../../src/cpp/rtps/transport/shared_mem/SharedMemGlobal.hpp" -#include "../../../src/cpp/rtps/transport/shared_mem/MultiProducerConsumerRingBuffer.hpp" - -#include #include +#include #include #include -#include -#include +#include #include +#include + +#include +#include +#include + +#include "../../../src/cpp/rtps/transport/shared_mem/MultiProducerConsumerRingBuffer.hpp" +#include "../../../src/cpp/rtps/transport/shared_mem/SharedMemGlobal.hpp" +#include "../../../src/cpp/rtps/transport/shared_mem/SharedMemManager.hpp" +#include "../../../src/cpp/rtps/transport/shared_mem/SharedMemSenderResource.hpp" +#include +#include + using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; using namespace eprosima::fastdds; @@ -386,7 +388,7 @@ TEST_F(SHMCondition, wait_notify) // POSIX glibc 2.25 conditions are not robust when used with interprocess shared memory: // https://sourceware.org/bugzilla/show_bug.cgi?id=21422 -// FastRTPS > v1.10.0 SHM has implemented robust conditions to solve issue #1144 +// Fast DDS > v1.10.0 SHM has implemented robust conditions to solve issue #1144 // This is the correspoding regresion test #ifndef _MSC_VER TEST_F(SHMCondition, robust_condition_fix_glibc_deadlock) @@ -733,7 +735,7 @@ TEST_F(SHMTransportTests, send_and_receive_between_ports) MockReceiverResource receiver(transportUnderTest, unicastLocator); MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); - eprosima::fastrtps::rtps::SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); ASSERT_FALSE(send_resource_list.empty()); ASSERT_TRUE(transportUnderTest.IsInputChannelOpen(unicastLocator)); @@ -796,7 +798,7 @@ TEST_F(SHMTransportTests, port_and_segment_overflow_discard) outputChannelLocator.kind = LOCATOR_KIND_SHM; outputChannelLocator.port = g_default_port + 1; - eprosima::fastrtps::rtps::SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[4] = { 'H', 'e', 'l', 'l'}; @@ -1781,7 +1783,7 @@ TEST_F(SHMTransportTests, remote_segments_free) LocatorList send_locators_list; send_locators_list.push_back(pub_locator); - eprosima::fastrtps::rtps::SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transport.OpenOutputChannel(send_resource_list, pub_locator)); std::function sub_callback = [&]() @@ -1817,7 +1819,7 @@ TEST_F(SHMTransportTests, remote_segments_free) LocatorList send_locators_list; send_locators_list.push_back(sub_locator); - eprosima::fastrtps::rtps::SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transport.OpenOutputChannel(send_resource_list, sub_locator)); std::chrono::high_resolution_clock::rep total_times = 0; @@ -1920,7 +1922,7 @@ TEST_F(SHMTransportTests, remote_segments_free) LocatorList send_locators_list; send_locators_list.push_back(sub_locator); - eprosima::fastrtps::rtps::SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(pub_transport.OpenOutputChannel(send_resource_list, sub_locator)); auto t0 = std::chrono::high_resolution_clock::now(); @@ -2005,7 +2007,7 @@ TEST_F(SHMTransportTests, remote_segments_free) LocatorList send_locators_list; send_locators_list.push_back(sub_locator); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(pub_transport.OpenOutputChannel(send_resource_list, sub_locator)); auto t0 = std::chrono::high_resolution_clock::now(); @@ -2052,7 +2054,7 @@ TEST_F(SHMTransportTests, dump_file) MockReceiverResource receiver(transportUnderTest, unicastLocator); MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); - eprosima::fastrtps::rtps::SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); ASSERT_FALSE(send_resource_list.empty()); ASSERT_TRUE(transportUnderTest.IsInputChannelOpen(unicastLocator)); diff --git a/test/unittest/transport/TCPv4Tests.cpp b/test/unittest/transport/TCPv4Tests.cpp index 7c6ad31efb0..3528123d6a5 100644 --- a/test/unittest/transport/TCPv4Tests.cpp +++ b/test/unittest/transport/TCPv4Tests.cpp @@ -17,17 +17,19 @@ #include #include -#include -#include "mock/MockTCPChannelResource.h" -#include "mock/MockTCPv4Transport.h" + #include #include -#include -#include +#include #include #include -#include +#include + +#include "mock/MockTCPChannelResource.h" +#include "mock/MockTCPv4Transport.h" +#include #include +#include using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; @@ -75,8 +77,8 @@ class TCPv4Tests : public ::testing::Test void HELPER_SetDescriptorDefaults(); - TCPv4TransportDescriptor descriptor; - TCPv4TransportDescriptor descriptorOnlyOutput; + eprosima::fastdds::rtps::TCPv4TransportDescriptor descriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor descriptorOnlyOutput; std::unique_ptr senderThread; std::unique_ptr receiverThread; }; @@ -110,7 +112,7 @@ TEST_F(TCPv4Tests, opening_and_closing_output_channel) genericOutputChannelLocator.kind = LOCATOR_KIND_TCPv4; genericOutputChannelLocator.port = g_output_port; // arbitrary IPLocator::setLogicalPort(genericOutputChannelLocator, g_output_port); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; // Then ASSERT_FALSE(transportUnderTest.is_output_channel_open_for(genericOutputChannelLocator)); @@ -137,7 +139,7 @@ TEST_F(TCPv4Tests, opening_and_closing_output_channel_with_listener) // acceptor (no channel resource is created until it receives a connection request). genericOutputChannelLocator.port = g_output_port + 1; IPLocator::setLogicalPort(genericOutputChannelLocator, g_output_port + 1); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; // Then ASSERT_FALSE(transportUnderTest.is_output_channel_open_for(genericOutputChannelLocator)); @@ -174,12 +176,12 @@ TEST_F(TCPv4Tests, send_and_receive_between_ports) eprosima::fastdds::dds::Log::SetVerbosity(eprosima::fastdds::dds::Log::Kind::Info); std::regex filter("RTCP(?!_SEQ)"); eprosima::fastdds::dds::Log::SetCategoryFilter(filter); - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; recvDescriptor.add_listener_port(g_default_port); TCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor; TCPv4Transport sendTransportUnderTest(sendDescriptor); sendTransportUnderTest.init(); @@ -202,7 +204,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_ports) MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); ASSERT_TRUE(receiveTransportUnderTest.IsInputChannelOpen(inputLocator)); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(sendTransportUnderTest.OpenOutputChannel(send_resource_list, outputLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[5] = { 'H', 'e', 'l', 'l', 'o' }; @@ -249,7 +251,7 @@ TEST_F(TCPv4Tests, send_is_rejected_if_buffer_size_is_bigger_to_size_specified_i genericOutputChannelLocator.kind = LOCATOR_KIND_TCPv4; genericOutputChannelLocator.port = g_output_port; IPLocator::setLogicalPort(genericOutputChannelLocator, 7400); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; transportUnderTest.OpenOutputChannel(send_resource_list, genericOutputChannelLocator); ASSERT_FALSE(send_resource_list.empty()); @@ -285,7 +287,7 @@ TEST_F(TCPv4Tests, RemoteToMainLocal_simply_strips_out_address_leaving_IP_ANY) ASSERT_EQ(mainLocalLocator.port, remote_locator.port); ASSERT_EQ(mainLocalLocator.kind, remote_locator.kind); - ASSERT_EQ(IPLocator::toIPv4string(mainLocalLocator), s_IPv4AddressAny); + ASSERT_EQ(IPLocator::toIPv4string(mainLocalLocator), eprosima::fastdds::rtps::s_IPv4AddressAny); } TEST_F(TCPv4Tests, match_if_port_AND_address_matches) @@ -317,7 +319,7 @@ TEST_F(TCPv4Tests, send_to_wrong_interface) outputChannelLocator.kind = LOCATOR_KIND_TCPv4; IPLocator::setLogicalPort(outputChannelLocator, 7400); IPLocator::setIPv4(outputChannelLocator, 127, 0, 0, 1); // Loopback - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); ASSERT_FALSE(send_resource_list.empty()); @@ -346,7 +348,7 @@ TEST_F(TCPv4Tests, send_to_blocked_interface) outputChannelLocator.kind = LOCATOR_KIND_TCPv4; IPLocator::setLogicalPort(outputChannelLocator, 7400); IPLocator::setIPv4(outputChannelLocator, 127, 0, 0, 1); // Loopback - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); ASSERT_FALSE(send_resource_list.empty()); @@ -386,13 +388,13 @@ TEST_F(TCPv4Tests, send_and_receive_between_allowed_interfaces_ports) eprosima::fastdds::dds::Log::SetVerbosity(eprosima::fastdds::dds::Log::Kind::Info); std::regex filter("RTCP(?!_SEQ)"); eprosima::fastdds::dds::Log::SetCategoryFilter(filter); - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; recvDescriptor.interfaceWhiteList.emplace_back(IPLocator::toIPv4string(locator)); recvDescriptor.add_listener_port(g_default_port); TCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor; sendDescriptor.interfaceWhiteList.emplace_back(IPLocator::toIPv4string(locator)); TCPv4Transport sendTransportUnderTest(sendDescriptor); sendTransportUnderTest.init(); @@ -417,7 +419,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_allowed_interfaces_ports) MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); ASSERT_TRUE(receiveTransportUnderTest.IsInputChannelOpen(inputLocator)); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(sendTransportUnderTest.OpenOutputChannel(send_resource_list, outputLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[5] = { 'H', 'e', 'l', 'l', 'o' }; @@ -490,7 +492,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_allowed_interfaces_ports_by_name) eprosima::fastdds::dds::Log::SetVerbosity(eprosima::fastdds::dds::Log::Kind::Info); std::regex filter("RTCP(?!_SEQ)"); eprosima::fastdds::dds::Log::SetCategoryFilter(filter); - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; std::cout << "Adding to whitelist: " << interfaces[0].dev << " " << interfaces[0].name << " " << interfaces[0].locator << std::endl; recvDescriptor.interfaceWhiteList.emplace_back(interfaces[0].dev); @@ -499,7 +501,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_allowed_interfaces_ports_by_name) TCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor; sendDescriptor.interfaceWhiteList.emplace_back(interfaces[0].dev); TCPv4Transport sendTransportUnderTest(sendDescriptor); @@ -525,7 +527,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_allowed_interfaces_ports_by_name) MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); ASSERT_TRUE(receiveTransportUnderTest.IsInputChannelOpen(inputLocator)); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(sendTransportUnderTest.OpenOutputChannel(send_resource_list, outputLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[5] = { 'H', 'e', 'l', 'l', 'o' }; @@ -618,7 +620,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_secure_ports_client_verifies) using TLSOptions = TCPTransportDescriptor::TLSConfig::TLSOptions; using TLSVerifyMode = TCPTransportDescriptor::TLSConfig::TLSVerifyMode; - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; recvDescriptor.add_listener_port(g_default_port); recvDescriptor.apply_security = true; recvDescriptor.tls_config.password = "fastddspwd"; @@ -633,7 +635,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_secure_ports_client_verifies) TCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor; sendDescriptor.apply_security = true; sendDescriptor.tls_config.verify_file = "ca.crt"; sendDescriptor.tls_config.verify_mode = TLSVerifyMode::VERIFY_PEER; @@ -664,7 +666,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_secure_ports_client_verifies) MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); ASSERT_TRUE(receiveTransportUnderTest.IsInputChannelOpen(inputLocator)); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(sendTransportUnderTest.OpenOutputChannel(send_resource_list, outputLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[5] = { 'H', 'e', 'l', 'l', 'o' }; @@ -715,7 +717,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_secure_ports_server_verifies) using TLSVerifyMode = TCPTransportDescriptor::TLSConfig::TLSVerifyMode; using TLSHSRole = TCPTransportDescriptor::TLSConfig::TLSHandShakeRole; - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; recvDescriptor.add_listener_port(g_default_port); recvDescriptor.apply_security = true; recvDescriptor.tls_config.handshake_role = TLSHSRole::CLIENT; @@ -728,7 +730,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_secure_ports_server_verifies) TCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor; sendDescriptor.apply_security = true; sendDescriptor.tls_config.handshake_role = TLSHSRole::SERVER; sendDescriptor.tls_config.password = "fastddspwd"; @@ -763,7 +765,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_secure_ports_server_verifies) MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); ASSERT_TRUE(receiveTransportUnderTest.IsInputChannelOpen(inputLocator)); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(sendTransportUnderTest.OpenOutputChannel(send_resource_list, outputLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[5] = { 'H', 'e', 'l', 'l', 'o' }; @@ -813,7 +815,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_both_secure_ports) using TLSOptions = TCPTransportDescriptor::TLSConfig::TLSOptions; using TLSVerifyMode = TCPTransportDescriptor::TLSConfig::TLSVerifyMode; - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; recvDescriptor.add_listener_port(g_default_port); recvDescriptor.apply_security = true; recvDescriptor.tls_config.password = "testkey"; @@ -830,7 +832,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_both_secure_ports) TCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor; sendDescriptor.apply_security = true; sendDescriptor.tls_config.password = "testkey"; sendDescriptor.tls_config.cert_chain_file = "mainsubcert.pem"; @@ -865,7 +867,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_both_secure_ports) MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); ASSERT_TRUE(receiveTransportUnderTest.IsInputChannelOpen(inputLocator)); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(sendTransportUnderTest.OpenOutputChannel(send_resource_list, outputLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[5] = { 'H', 'e', 'l', 'l', 'o' }; @@ -915,7 +917,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_both_secure_ports_untrusted) using TLSOptions = TCPTransportDescriptor::TLSConfig::TLSOptions; using TLSVerifyMode = TCPTransportDescriptor::TLSConfig::TLSVerifyMode; - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; recvDescriptor.add_listener_port(g_default_port); recvDescriptor.apply_security = true; recvDescriptor.tls_config.password = "testkey"; @@ -932,7 +934,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_both_secure_ports_untrusted) TCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor; sendDescriptor.apply_security = true; sendDescriptor.tls_config.password = "testkey"; sendDescriptor.tls_config.cert_chain_file = "mainsubcert.pem"; @@ -967,7 +969,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_both_secure_ports_untrusted) MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); ASSERT_TRUE(receiveTransportUnderTest.IsInputChannelOpen(inputLocator)); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(sendTransportUnderTest.OpenOutputChannel(send_resource_list, outputLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[5] = { 'H', 'e', 'l', 'l', 'o' }; @@ -1022,7 +1024,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_secure_clients_1) using TLSOptions = TCPTransportDescriptor::TLSConfig::TLSOptions; using TLSHSRole = TCPTransportDescriptor::TLSConfig::TLSHandShakeRole; - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; recvDescriptor.add_listener_port(g_default_port); recvDescriptor.apply_security = true; recvDescriptor.tls_config.handshake_role = TLSHSRole::CLIENT; @@ -1038,7 +1040,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_secure_clients_1) TCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor; sendDescriptor.apply_security = true; sendDescriptor.tls_config.handshake_role = TLSHSRole::SERVER; sendDescriptor.tls_config.password = "testkey"; @@ -1073,7 +1075,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_secure_clients_1) MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); ASSERT_TRUE(receiveTransportUnderTest.IsInputChannelOpen(inputLocator)); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(sendTransportUnderTest.OpenOutputChannel(send_resource_list, outputLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[5] = { 'H', 'e', 'l', 'l', 'o' }; @@ -1124,7 +1126,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_secure_ports_untrusted_server) using TLSOptions = TCPTransportDescriptor::TLSConfig::TLSOptions; using TLSVerifyMode = TCPTransportDescriptor::TLSConfig::TLSVerifyMode; - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; recvDescriptor.add_listener_port(g_default_port); recvDescriptor.apply_security = true; recvDescriptor.tls_config.password = "testkey"; @@ -1140,7 +1142,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_secure_ports_untrusted_server) TCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor; sendDescriptor.apply_security = true; sendDescriptor.tls_config.verify_file = "ca.pem"; // This CA doesn't know about these certificates sendDescriptor.tls_config.verify_mode = TLSVerifyMode::VERIFY_PEER; @@ -1172,7 +1174,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_secure_ports_untrusted_server) MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); ASSERT_TRUE(receiveTransportUnderTest.IsInputChannelOpen(inputLocator)); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(sendTransportUnderTest.OpenOutputChannel(send_resource_list, outputLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[5] = { 'H', 'e', 'l', 'l', 'o' }; @@ -1229,7 +1231,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_both_secure_ports_with_sni) using TLSOptions = TCPTransportDescriptor::TLSConfig::TLSOptions; using TLSVerifyMode = TCPTransportDescriptor::TLSConfig::TLSVerifyMode; - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; recvDescriptor.add_listener_port(g_default_port); recvDescriptor.apply_security = true; recvDescriptor.tls_config.password = "testkey"; @@ -1246,7 +1248,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_both_secure_ports_with_sni) TCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor; sendDescriptor.apply_security = true; sendDescriptor.tls_config.password = "testkey"; sendDescriptor.tls_config.cert_chain_file = "mainsubcert.pem"; @@ -1282,7 +1284,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_both_secure_ports_with_sni) MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); ASSERT_TRUE(receiveTransportUnderTest.IsInputChannelOpen(inputLocator)); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(sendTransportUnderTest.OpenOutputChannel(send_resource_list, outputLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[5] = { 'H', 'e', 'l', 'l', 'o' }; @@ -1337,7 +1339,7 @@ TEST_F(TCPv4Tests, secure_non_blocking_send) // Create a TCP Server transport using TLSOptions = TCPTransportDescriptor::TLSConfig::TLSOptions; using TLSVerifyMode = TCPTransportDescriptor::TLSConfig::TLSVerifyMode; - TCPv4TransportDescriptor senderDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor senderDescriptor; senderDescriptor.add_listener_port(port); senderDescriptor.apply_security = true; senderDescriptor.non_blocking_send = true; @@ -1476,13 +1478,13 @@ TEST_F(TCPv4Tests, send_and_receive_between_allowed_localhost_interfaces_ports) eprosima::fastdds::dds::Log::SetVerbosity(eprosima::fastdds::dds::Log::Kind::Info); std::regex filter("RTCP(?!_SEQ)"); eprosima::fastdds::dds::Log::SetCategoryFilter(filter); - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; recvDescriptor.interfaceWhiteList.emplace_back("127.0.0.1"); recvDescriptor.add_listener_port(g_default_port); TCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor; sendDescriptor.interfaceWhiteList.emplace_back("127.0.0.1"); TCPv4Transport sendTransportUnderTest(sendDescriptor); sendTransportUnderTest.init(); @@ -1507,7 +1509,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_allowed_localhost_interfaces_ports) MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); ASSERT_TRUE(receiveTransportUnderTest.IsInputChannelOpen(inputLocator)); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(sendTransportUnderTest.OpenOutputChannel(send_resource_list, outputLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[5] = { 'H', 'e', 'l', 'l', 'o' }; @@ -1571,13 +1573,13 @@ TEST_F(TCPv4Tests, send_and_receive_between_blocked_interfaces_ports) eprosima::fastdds::dds::Log::SetVerbosity(eprosima::fastdds::dds::Log::Kind::Info); std::regex filter("RTCP(?!_SEQ)"); eprosima::fastdds::dds::Log::SetCategoryFilter(filter); - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; recvDescriptor.interfaceWhiteList.emplace_back(IPLocator::toIPv4string(locator)); recvDescriptor.add_listener_port(g_default_port); TCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor; sendDescriptor.interfaceWhiteList.emplace_back(IPLocator::toIPv4string(locator)); TCPv4Transport sendTransportUnderTest(sendDescriptor); sendTransportUnderTest.init(); @@ -1602,7 +1604,7 @@ TEST_F(TCPv4Tests, send_and_receive_between_blocked_interfaces_ports) MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); ASSERT_TRUE(receiveTransportUnderTest.IsInputChannelOpen(inputLocator)); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(sendTransportUnderTest.OpenOutputChannel(send_resource_list, outputLocator)); ASSERT_FALSE(send_resource_list.empty()); octet message[5] = { 'H', 'e', 'l', 'l', 'o' }; @@ -1663,7 +1665,7 @@ TEST_F(TCPv4Tests, receive_unordered_data) "-RTCRTC", "-RTCRT", "-RTCR" }; - struct Receiver : public TransportReceiverInterface + struct Receiver : public eprosima::fastdds::rtps::TransportReceiverInterface { std::array num_received{ 0, 0, 0 }; @@ -1697,7 +1699,7 @@ TEST_F(TCPv4Tests, receive_unordered_data) Receiver receiver; - TCPv4TransportDescriptor test_descriptor = descriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor test_descriptor = descriptor; test_descriptor.check_crc = false; TCPv4Transport uut(test_descriptor); ASSERT_TRUE(uut.init()) << "Failed to initialize transport. Port " << g_default_port << " may be in use"; @@ -1790,7 +1792,7 @@ TEST_F(TCPv4Tests, header_read_interrumption) std::regex filter("RTCP(?!_SEQ)"); eprosima::fastdds::dds::Log::SetCategoryFilter(filter); - TCPv4TransportDescriptor test_descriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor test_descriptor; test_descriptor.add_listener_port(g_default_port); TCPv4Transport transportUnderTest(test_descriptor); transportUnderTest.init(); @@ -1832,7 +1834,7 @@ TEST_F(TCPv4Tests, header_read_interrumption) TEST_F(TCPv4Tests, autofill_port) { // Check normal port assignation - TCPv4TransportDescriptor test_descriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor test_descriptor; test_descriptor.add_listener_port(g_default_port); TCPv4Transport transportUnderTest(test_descriptor); transportUnderTest.init(); @@ -1840,7 +1842,7 @@ TEST_F(TCPv4Tests, autofill_port) EXPECT_TRUE(transportUnderTest.configuration()->listening_ports[0] == g_default_port); // Check default port assignation - TCPv4TransportDescriptor test_descriptor_autofill; + eprosima::fastdds::rtps::TCPv4TransportDescriptor test_descriptor_autofill; test_descriptor_autofill.add_listener_port(0); TCPv4Transport transportUnderTest_autofill(test_descriptor_autofill); transportUnderTest_autofill.init(); @@ -1854,16 +1856,16 @@ TEST_F(TCPv4Tests, autofill_port) // process this lead to overwriting server's channel resources map elements. TEST_F(TCPv4Tests, client_announced_local_port_uniqueness) { - TCPv4TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor recvDescriptor; recvDescriptor.add_listener_port(g_default_port); MockTCPv4Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv4TransportDescriptor sendDescriptor_1; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor_1; TCPv4Transport sendTransportUnderTest_1(sendDescriptor_1); sendTransportUnderTest_1.init(); - TCPv4TransportDescriptor sendDescriptor_2; + eprosima::fastdds::rtps::TCPv4TransportDescriptor sendDescriptor_2; TCPv4Transport sendTransportUnderTest_2(sendDescriptor_2); sendTransportUnderTest_2.init(); @@ -1873,11 +1875,11 @@ TEST_F(TCPv4Tests, client_announced_local_port_uniqueness) outputLocator.port = g_default_port; IPLocator::setLogicalPort(outputLocator, 7410); - SendResourceList send_resource_list_1; + eprosima::fastdds::rtps::SendResourceList send_resource_list_1; ASSERT_TRUE(sendTransportUnderTest_1.OpenOutputChannel(send_resource_list_1, outputLocator)); ASSERT_FALSE(send_resource_list_1.empty()); - SendResourceList send_resource_list_2; + eprosima::fastdds::rtps::SendResourceList send_resource_list_2; ASSERT_TRUE(sendTransportUnderTest_2.OpenOutputChannel(send_resource_list_2, outputLocator)); ASSERT_FALSE(send_resource_list_2.empty()); @@ -1894,7 +1896,7 @@ TEST_F(TCPv4Tests, non_blocking_send) uint16_t port = g_default_port; uint32_t msg_size = eprosima::fastdds::rtps::s_minimumSocketBuffer; // Create a TCP Server transport - TCPv4TransportDescriptor senderDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor senderDescriptor; senderDescriptor.add_listener_port(port); senderDescriptor.non_blocking_send = true; senderDescriptor.sendBufferSize = msg_size; @@ -1987,13 +1989,13 @@ TEST_F(TCPv4Tests, reconnect_after_open_port_failure) eprosima::fastdds::dds::Log::SetVerbosity(eprosima::fastdds::dds::Log::Warning); uint16_t port = g_default_port; // Create a TCP Server transport - TCPv4TransportDescriptor serverDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor serverDescriptor; serverDescriptor.add_listener_port(port); std::unique_ptr serverTransportUnderTest(new TCPv4Transport(serverDescriptor)); serverTransportUnderTest->init(); // Create a TCP Client transport - TCPv4TransportDescriptor clientDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor clientDescriptor; std::unique_ptr clientTransportUnderTest(new MockTCPv4Transport(clientDescriptor)); clientTransportUnderTest->init(); @@ -2004,7 +2006,7 @@ TEST_F(TCPv4Tests, reconnect_after_open_port_failure) // Connect client to server EXPECT_TRUE(serverTransportUnderTest->OpenInputChannel(initialPeerLocator, nullptr, 0x00FF)); - SendResourceList client_resource_list; + eprosima::fastdds::rtps::SendResourceList client_resource_list; ASSERT_TRUE(clientTransportUnderTest->OpenOutputChannel(client_resource_list, initialPeerLocator)); ASSERT_FALSE(client_resource_list.empty()); std::this_thread::sleep_for(std::chrono::milliseconds(300)); @@ -2082,7 +2084,7 @@ TEST_F(TCPv4Tests, opening_output_channel_with_same_locator_as_local_listening_p IPLocator::setIPv4(lowerOutputChannelLocator, 1, 1, 1, 1); IPLocator::setIPv4(higherOutputChannelLocator, 255, 255, 255, 255); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; // If the remote address is lower than the local one, no channel must be created but it must be added to the send_resource_list ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, lowerOutputChannelLocator)); @@ -2109,7 +2111,7 @@ TEST_F(TCPv4Tests, remove_from_send_resource_list) for (const std::string& test_case : test_cases) { - TCPv4TransportDescriptor send_descriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor send_descriptor; MockTCPv4Transport send_transport_under_test(send_descriptor); send_transport_under_test.init(); @@ -2136,7 +2138,7 @@ TEST_F(TCPv4Tests, remove_from_send_resource_list) initial_peer_list.push_back(initial_peer_locator); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(send_transport_under_test.OpenOutputChannel(send_resource_list, discovery_locator)); ASSERT_TRUE(send_transport_under_test.OpenOutputChannel(send_resource_list, initial_peer_locator)); ASSERT_EQ(send_resource_list.size(), 2u); @@ -2193,7 +2195,7 @@ TEST_F(TCPv4Tests, add_logical_port_on_send_resource_creation) // TCP Client { uint16_t port = 12345; - TCPv4TransportDescriptor clientDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor clientDescriptor; std::unique_ptr clientTransportUnderTest(new MockTCPv4Transport(clientDescriptor)); clientTransportUnderTest->init(); @@ -2203,7 +2205,7 @@ TEST_F(TCPv4Tests, add_logical_port_on_send_resource_creation) IPLocator::setLogicalPort(initialPeerLocator, 7410); // OpenOutputChannel - SendResourceList client_resource_list; + eprosima::fastdds::rtps::SendResourceList client_resource_list; ASSERT_TRUE(clientTransportUnderTest->OpenOutputChannel(client_resource_list, initialPeerLocator)); IPLocator::setLogicalPort(initialPeerLocator, 7411); ASSERT_TRUE(clientTransportUnderTest->OpenOutputChannel(client_resource_list, initialPeerLocator)); @@ -2223,7 +2225,7 @@ TEST_F(TCPv4Tests, add_logical_port_on_send_resource_creation) // Discovered participant physical port has to have a lower value than the listening port to behave as a server uint16_t participantPhysicalLocator = 12344; // Create a TCP Server transport - TCPv4TransportDescriptor serverDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor serverDescriptor; serverDescriptor.add_listener_port(port); std::unique_ptr serverTransportUnderTest(new MockTCPv4Transport(serverDescriptor)); serverTransportUnderTest->init(); @@ -2235,7 +2237,7 @@ TEST_F(TCPv4Tests, add_logical_port_on_send_resource_creation) IPLocator::setLogicalPort(discoveredParticipantLocator, 7410); // OpenOutputChannel - SendResourceList server_resource_list; + eprosima::fastdds::rtps::SendResourceList server_resource_list; ASSERT_TRUE(serverTransportUnderTest->OpenOutputChannel(server_resource_list, discoveredParticipantLocator)); IPLocator::setLogicalPort(discoveredParticipantLocator, 7411); ASSERT_TRUE(serverTransportUnderTest->OpenOutputChannel(server_resource_list, discoveredParticipantLocator)); @@ -2258,7 +2260,7 @@ TEST_F(TCPv4Tests, add_logical_port_on_send_resource_creation) // Discovered participant physical port has to have a larger value than the listening port to behave as a client uint16_t participantPhysicalLocator = 12346; // Create a TCP Client transport - TCPv4TransportDescriptor clientDescriptor; + eprosima::fastdds::rtps::TCPv4TransportDescriptor clientDescriptor; clientDescriptor.add_listener_port(port); std::unique_ptr clientTransportUnderTest(new MockTCPv4Transport(clientDescriptor)); clientTransportUnderTest->init(); @@ -2270,7 +2272,7 @@ TEST_F(TCPv4Tests, add_logical_port_on_send_resource_creation) IPLocator::setLogicalPort(discoveredParticipantLocator, 7410); // OpenOutputChannel - SendResourceList client_resource_list; + eprosima::fastdds::rtps::SendResourceList client_resource_list; ASSERT_TRUE(clientTransportUnderTest->OpenOutputChannel(client_resource_list, discoveredParticipantLocator)); IPLocator::setLogicalPort(discoveredParticipantLocator, 7411); ASSERT_TRUE(clientTransportUnderTest->OpenOutputChannel(client_resource_list, discoveredParticipantLocator)); diff --git a/test/unittest/transport/TCPv6Tests.cpp b/test/unittest/transport/TCPv6Tests.cpp index c88a79ff063..e7f1138074c 100644 --- a/test/unittest/transport/TCPv6Tests.cpp +++ b/test/unittest/transport/TCPv6Tests.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include @@ -78,7 +78,7 @@ class TCPv6Tests : public ::testing::Test void HELPER_SetDescriptorDefaults(); - TCPv6TransportDescriptor descriptor; + eprosima::fastdds::rtps::TCPv6TransportDescriptor descriptor; std::unique_ptr senderThread; std::unique_ptr receiverThread; }; @@ -164,7 +164,7 @@ TEST_F(TCPv6Tests, opening_and_closing_input_channel) RTPSParticipantAttributes p_attr{}; NetworkFactory factory{p_attr}; - factory.RegisterTransport(descriptor); + factory.RegisterTransport(descriptor); std::vector> receivers; factory.BuildReceiverResources(multicastFilterLocator, receivers, 0x8FFF); ReceiverResource* receiver = receivers.back().get(); @@ -183,7 +183,7 @@ TEST_F(TCPv6Tests, opening_and_closing_input_channel) TEST_F(TCPv6Tests, autofill_port) { // Check normal port assignation - TCPv6TransportDescriptor test_descriptor; + eprosima::fastdds::rtps::TCPv6TransportDescriptor test_descriptor; test_descriptor.add_listener_port(g_default_port); TCPv6Transport transportUnderTest(test_descriptor); transportUnderTest.init(); @@ -191,7 +191,7 @@ TEST_F(TCPv6Tests, autofill_port) EXPECT_TRUE(transportUnderTest.configuration()->listening_ports[0] == g_default_port); // Check default port assignation - TCPv6TransportDescriptor test_descriptor_autofill; + eprosima::fastdds::rtps::TCPv6TransportDescriptor test_descriptor_autofill; test_descriptor_autofill.add_listener_port(0); TCPv6Transport transportUnderTest_autofill(test_descriptor_autofill); transportUnderTest_autofill.init(); @@ -269,16 +269,16 @@ TEST_F(TCPv6Tests, check_TCPv6_interface_whitelist_initialization) // process this lead to overwriting server's channel resources map elements. TEST_F(TCPv6Tests, client_announced_local_port_uniqueness) { - TCPv6TransportDescriptor recvDescriptor; + eprosima::fastdds::rtps::TCPv6TransportDescriptor recvDescriptor; recvDescriptor.add_listener_port(g_default_port); MockTCPv6Transport receiveTransportUnderTest(recvDescriptor); receiveTransportUnderTest.init(); - TCPv6TransportDescriptor sendDescriptor_1; + eprosima::fastdds::rtps::TCPv6TransportDescriptor sendDescriptor_1; TCPv6Transport sendTransportUnderTest_1(sendDescriptor_1); sendTransportUnderTest_1.init(); - TCPv6TransportDescriptor sendDescriptor_2; + eprosima::fastdds::rtps::TCPv6TransportDescriptor sendDescriptor_2; TCPv6Transport sendTransportUnderTest_2(sendDescriptor_2); sendTransportUnderTest_2.init(); @@ -288,11 +288,11 @@ TEST_F(TCPv6Tests, client_announced_local_port_uniqueness) outputLocator.port = g_default_port; IPLocator::setLogicalPort(outputLocator, 7610); - SendResourceList send_resource_list_1; + eprosima::fastdds::rtps::SendResourceList send_resource_list_1; ASSERT_TRUE(sendTransportUnderTest_1.OpenOutputChannel(send_resource_list_1, outputLocator)); ASSERT_FALSE(send_resource_list_1.empty()); - SendResourceList send_resource_list_2; + eprosima::fastdds::rtps::SendResourceList send_resource_list_2; ASSERT_TRUE(sendTransportUnderTest_2.OpenOutputChannel(send_resource_list_2, outputLocator)); ASSERT_FALSE(send_resource_list_2.empty()); @@ -309,7 +309,7 @@ TEST_F(TCPv6Tests, non_blocking_send) uint16_t port = g_default_port; uint32_t msg_size = eprosima::fastdds::rtps::s_minimumSocketBuffer; // Create a TCP Server transport - TCPv6TransportDescriptor senderDescriptor; + eprosima::fastdds::rtps::TCPv6TransportDescriptor senderDescriptor; senderDescriptor.add_listener_port(port); senderDescriptor.non_blocking_send = true; senderDescriptor.sendBufferSize = msg_size; @@ -402,13 +402,13 @@ TEST_F(TCPv6Tests, reconnect_after_open_port_failure) eprosima::fastdds::dds::Log::SetVerbosity(eprosima::fastdds::dds::Log::Warning); uint16_t port = g_default_port; // Create a TCP Server transport - TCPv6TransportDescriptor serverDescriptor; + eprosima::fastdds::rtps::TCPv6TransportDescriptor serverDescriptor; serverDescriptor.add_listener_port(port); std::unique_ptr serverTransportUnderTest(new TCPv6Transport(serverDescriptor)); serverTransportUnderTest->init(); // Create a TCP Client transport - TCPv6TransportDescriptor clientDescriptor; + eprosima::fastdds::rtps::TCPv6TransportDescriptor clientDescriptor; std::unique_ptr clientTransportUnderTest(new MockTCPv6Transport(clientDescriptor)); clientTransportUnderTest->init(); @@ -419,7 +419,7 @@ TEST_F(TCPv6Tests, reconnect_after_open_port_failure) // Connect client to server EXPECT_TRUE(serverTransportUnderTest->OpenInputChannel(initialPeerLocator, nullptr, 0x00FF)); - SendResourceList client_resource_list; + eprosima::fastdds::rtps::SendResourceList client_resource_list; ASSERT_TRUE(clientTransportUnderTest->OpenOutputChannel(client_resource_list, initialPeerLocator)); ASSERT_FALSE(client_resource_list.empty()); std::this_thread::sleep_for(std::chrono::milliseconds(300)); @@ -496,7 +496,7 @@ TEST_F(TCPv6Tests, opening_output_channel_with_same_locator_as_local_listening_p IPLocator::setIPv6(lowerOutputChannelLocator, "::"); IPLocator::setIPv6(higherOutputChannelLocator, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; // If the remote address is lower than the local one, no channel must be created but it must be added to the send_resource_list ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, lowerOutputChannelLocator)); @@ -512,7 +512,7 @@ TEST_F(TCPv6Tests, opening_output_channel_with_same_locator_as_local_listening_p // from the channel_resources_map. TEST_F(TCPv6Tests, remove_from_send_resource_list) { - TCPv6TransportDescriptor send_descriptor; + eprosima::fastdds::rtps::TCPv6TransportDescriptor send_descriptor; MockTCPv6Transport send_transport_under_test(send_descriptor); send_transport_under_test.init(); @@ -527,7 +527,7 @@ TEST_F(TCPv6Tests, remove_from_send_resource_list) LocatorList_t initial_peer_list; initial_peer_list.push_back(output_locator_2); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(send_transport_under_test.OpenOutputChannel(send_resource_list, output_locator_1)); ASSERT_TRUE(send_transport_under_test.OpenOutputChannel(send_resource_list, output_locator_2)); ASSERT_EQ(send_resource_list.size(), 2u); @@ -572,7 +572,7 @@ TEST_F(TCPv6Tests, add_logical_port_on_send_resource_creation) // TCP Client { uint16_t port = 12345; - TCPv6TransportDescriptor clientDescriptor; + eprosima::fastdds::rtps::TCPv6TransportDescriptor clientDescriptor; std::unique_ptr clientTransportUnderTest(new MockTCPv6Transport(clientDescriptor)); clientTransportUnderTest->init(); @@ -582,7 +582,7 @@ TEST_F(TCPv6Tests, add_logical_port_on_send_resource_creation) IPLocator::setLogicalPort(initialPeerLocator, 7410); // OpenOutputChannel - SendResourceList client_resource_list; + eprosima::fastdds::rtps::SendResourceList client_resource_list; ASSERT_TRUE(clientTransportUnderTest->OpenOutputChannel(client_resource_list, initialPeerLocator)); IPLocator::setLogicalPort(initialPeerLocator, 7411); ASSERT_TRUE(clientTransportUnderTest->OpenOutputChannel(client_resource_list, initialPeerLocator)); @@ -602,7 +602,7 @@ TEST_F(TCPv6Tests, add_logical_port_on_send_resource_creation) // Discovered participant physical port has to have a lower value than the listening port to behave as a server uint16_t participantPhysicalLocator = 12344; // Create a TCP Server transport - TCPv6TransportDescriptor serverDescriptor; + eprosima::fastdds::rtps::TCPv6TransportDescriptor serverDescriptor; serverDescriptor.add_listener_port(port); std::unique_ptr serverTransportUnderTest(new MockTCPv6Transport(serverDescriptor)); serverTransportUnderTest->init(); @@ -613,7 +613,7 @@ TEST_F(TCPv6Tests, add_logical_port_on_send_resource_creation) IPLocator::setLogicalPort(discoveredParticipantLocator, 7410); // OpenOutputChannel - SendResourceList server_resource_list; + eprosima::fastdds::rtps::SendResourceList server_resource_list; ASSERT_TRUE(serverTransportUnderTest->OpenOutputChannel(server_resource_list, discoveredParticipantLocator)); IPLocator::setLogicalPort(discoveredParticipantLocator, 7411); ASSERT_TRUE(serverTransportUnderTest->OpenOutputChannel(server_resource_list, discoveredParticipantLocator)); @@ -636,7 +636,7 @@ TEST_F(TCPv6Tests, add_logical_port_on_send_resource_creation) // Discovered participant physical port has to have a larger value than the listening port to behave as a client uint16_t participantPhysicalLocator = 12346; // Create a TCP Client transport - TCPv6TransportDescriptor clientDescriptor; + eprosima::fastdds::rtps::TCPv6TransportDescriptor clientDescriptor; clientDescriptor.add_listener_port(port); std::unique_ptr clientTransportUnderTest(new MockTCPv6Transport(clientDescriptor)); clientTransportUnderTest->init(); @@ -647,7 +647,7 @@ TEST_F(TCPv6Tests, add_logical_port_on_send_resource_creation) IPLocator::setLogicalPort(discoveredParticipantLocator, 7410); // OpenOutputChannel - SendResourceList client_resource_list; + eprosima::fastdds::rtps::SendResourceList client_resource_list; ASSERT_TRUE(clientTransportUnderTest->OpenOutputChannel(client_resource_list, discoveredParticipantLocator)); IPLocator::setLogicalPort(discoveredParticipantLocator, 7411); ASSERT_TRUE(clientTransportUnderTest->OpenOutputChannel(client_resource_list, discoveredParticipantLocator)); diff --git a/test/unittest/transport/UDPv4Tests.cpp b/test/unittest/transport/UDPv4Tests.cpp index 430e58feabf..5e88c26686c 100644 --- a/test/unittest/transport/UDPv4Tests.cpp +++ b/test/unittest/transport/UDPv4Tests.cpp @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include #include @@ -70,7 +70,7 @@ class UDPv4Tests : public ::testing::Test void HELPER_SetDescriptorDefaults(); - UDPv4TransportDescriptor descriptor; + eprosima::fastdds::rtps::UDPv4TransportDescriptor descriptor; std::unique_ptr senderThread; std::unique_ptr receiverThread; }; @@ -129,7 +129,7 @@ TEST_F(UDPv4Tests, send_and_receive_between_ports) MockReceiverResource receiver(transportUnderTest, multicastLocator); MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, multicastLocator)); ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); // Includes loopback ASSERT_FALSE(send_resource_list.empty()); @@ -189,7 +189,7 @@ TEST_F(UDPv4Tests, send_to_loopback) MockReceiverResource receiver(transportUnderTest, multicastLocator); MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, multicastLocator)); ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); // Includes loopback ASSERT_FALSE(send_resource_list.empty()); @@ -238,7 +238,7 @@ TEST_F(UDPv4Tests, send_is_rejected_if_buffer_size_is_bigger_to_size_specified_i UDPv4Transport transportUnderTest(descriptor); transportUnderTest.init(); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t genericOutputChannelLocator; genericOutputChannelLocator.kind = LOCATOR_KIND_UDPv4; genericOutputChannelLocator.port = g_default_port; @@ -277,7 +277,7 @@ TEST_F(UDPv4Tests, RemoteToMainLocal_simply_strips_out_address_leaving_IP_ANY) ASSERT_EQ(mainLocalLocator.port, remote_locator.port); ASSERT_EQ(mainLocalLocator.kind, remote_locator.kind); - ASSERT_EQ(IPLocator::toIPv4string(mainLocalLocator), s_IPv4AddressAny); + ASSERT_EQ(IPLocator::toIPv4string(mainLocalLocator), eprosima::fastdds::rtps::s_IPv4AddressAny); } TEST_F(UDPv4Tests, match_if_port_AND_address_matches) @@ -304,7 +304,7 @@ TEST_F(UDPv4Tests, send_to_wrong_interface) UDPv4Transport transportUnderTest(descriptor); transportUnderTest.init(); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t outputChannelLocator; outputChannelLocator.port = g_default_port; outputChannelLocator.kind = LOCATOR_KIND_UDPv4; @@ -332,7 +332,7 @@ TEST_F(UDPv4Tests, send_to_blocked_interface) UDPv4Transport transportUnderTest(descriptor); transportUnderTest.init(); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t outputChannelLocator; outputChannelLocator.port = g_default_port; outputChannelLocator.kind = LOCATOR_KIND_UDPv4; @@ -362,7 +362,7 @@ TEST_F(UDPv4Tests, send_to_allowed_interface) UDPv4Transport transportUnderTest(descriptor); transportUnderTest.init(); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t outputChannelLocator; outputChannelLocator.port = g_default_port; outputChannelLocator.kind = LOCATOR_KIND_UDPv4; @@ -429,7 +429,7 @@ TEST_F(UDPv4Tests, send_and_receive_between_allowed_sockets_using_localhost) MockReceiverResource receiver(transportUnderTest, unicastLocator); MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, unicastLocator)); ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); // Includes loopback ASSERT_FALSE(send_resource_list.empty()); @@ -490,7 +490,7 @@ TEST_F(UDPv4Tests, send_and_receive_between_allowed_sockets_using_unicast) MockReceiverResource receiver(transportUnderTest, unicastLocator); MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, unicastLocator)); ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); // Includes loopback ASSERT_FALSE(send_resource_list.empty()); @@ -552,7 +552,7 @@ TEST_F(UDPv4Tests, send_and_receive_between_allowed_sockets_using_unicast_to_mul MockReceiverResource receiver(transportUnderTest, unicastLocator); MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, unicastLocator)); ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); // Includes loopback ASSERT_FALSE(send_resource_list.empty()); @@ -656,7 +656,7 @@ TEST_F(UDPv4Tests, simple_throughput) sub_locator.port = 50000; IPLocator::setIPv4(sub_locator, 127, 0, 0, 1); - UDPv4TransportDescriptor my_descriptor; + eprosima::fastdds::rtps::UDPv4TransportDescriptor my_descriptor; // Subscriber @@ -681,7 +681,7 @@ TEST_F(UDPv4Tests, simple_throughput) LocatorList_t send_locators_list; send_locators_list.push_back(sub_locator); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(pub_transport.OpenOutputChannel(send_resource_list, sub_locator)); auto t0 = std::chrono::high_resolution_clock::now(); diff --git a/test/unittest/transport/UDPv6Tests.cpp b/test/unittest/transport/UDPv6Tests.cpp index 805518934c5..7553b97e3cb 100644 --- a/test/unittest/transport/UDPv6Tests.cpp +++ b/test/unittest/transport/UDPv6Tests.cpp @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include @@ -78,7 +78,7 @@ class UDPv6Tests : public ::testing::Test void HELPER_SetDescriptorDefaults(); - UDPv6TransportDescriptor descriptor; + eprosima::fastdds::rtps::UDPv6TransportDescriptor descriptor; std::unique_ptr senderThread; std::unique_ptr receiverThread; }; @@ -167,7 +167,7 @@ TEST_F(UDPv6Tests, send_and_receive_between_ports) MockReceiverResource receiver(transportUnderTest, multicastLocator); MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, multicastLocator)); ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); // Includes loopback ASSERT_FALSE(send_resource_list.empty()); @@ -227,7 +227,7 @@ TEST_F(UDPv6Tests, send_to_loopback) MockReceiverResource receiver(transportUnderTest, multicastLocator); MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, multicastLocator)); ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); ASSERT_FALSE(send_resource_list.empty()); @@ -276,7 +276,7 @@ TEST_F(UDPv6Tests, send_is_rejected_if_buffer_size_is_bigger_to_size_specified_i UDPv6Transport transportUnderTest(descriptor); transportUnderTest.init(); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t genericOutputChannelLocator; genericOutputChannelLocator.kind = LOCATOR_KIND_UDPv6; genericOutputChannelLocator.port = g_default_port; @@ -315,7 +315,7 @@ TEST_F(UDPv6Tests, RemoteToMainLocal_simply_strips_out_address_leaving_IP_ANY) ASSERT_EQ(mainLocalLocator.port, remote_locator.port); ASSERT_EQ(mainLocalLocator.kind, remote_locator.kind); - ASSERT_EQ(IPLocator::toIPv6string(mainLocalLocator), s_IPv6AddressAny); + ASSERT_EQ(IPLocator::toIPv6string(mainLocalLocator), eprosima::fastdds::rtps::s_IPv6AddressAny); } TEST_F(UDPv6Tests, match_if_port_AND_address_matches) @@ -343,7 +343,7 @@ TEST_F(UDPv6Tests, send_to_wrong_interface) UDPv6Transport transportUnderTest(descriptor); transportUnderTest.init(); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t outputChannelLocator; outputChannelLocator.port = g_default_port; outputChannelLocator.kind = LOCATOR_KIND_UDPv6; @@ -372,7 +372,7 @@ TEST_F(UDPv6Tests, send_to_blocked_interface) UDPv6Transport transportUnderTest(descriptor); transportUnderTest.init(); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t outputChannelLocator; outputChannelLocator.port = g_default_port; outputChannelLocator.kind = LOCATOR_KIND_UDPv6; @@ -402,7 +402,7 @@ TEST_F(UDPv6Tests, send_to_allowed_interface) UDPv6Transport transportUnderTest(descriptor); transportUnderTest.init(); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; Locator_t outputChannelLocator; outputChannelLocator.port = g_default_port; outputChannelLocator.kind = LOCATOR_KIND_UDPv6; @@ -470,7 +470,7 @@ TEST_F(UDPv6Tests, send_and_receive_between_allowed_sockets_using_localhost) MockReceiverResource receiver(transportUnderTest, unicastLocator); MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, unicastLocator)); ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); // Includes loopback ASSERT_FALSE(send_resource_list.empty()); @@ -531,7 +531,7 @@ TEST_F(UDPv6Tests, send_and_receive_between_allowed_sockets_using_unicast) MockReceiverResource receiver(transportUnderTest, unicastLocator); MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, unicastLocator)); ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); // Includes loopback ASSERT_FALSE(send_resource_list.empty()); @@ -593,7 +593,7 @@ TEST_F(UDPv6Tests, send_and_receive_between_allowed_sockets_using_unicast_to_mul MockReceiverResource receiver(transportUnderTest, unicastLocator); MockMessageReceiver* msg_recv = dynamic_cast(receiver.CreateMessageReceiver()); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, unicastLocator)); ASSERT_TRUE(transportUnderTest.OpenOutputChannel(send_resource_list, outputChannelLocator)); // Includes loopback ASSERT_FALSE(send_resource_list.empty()); @@ -697,7 +697,7 @@ TEST_F(UDPv6Tests, simple_throughput) sub_locator.port = 50000; IPLocator::setIPv6(sub_locator, std::string("::1")); - UDPv6TransportDescriptor my_descriptor; + eprosima::fastdds::rtps::UDPv6TransportDescriptor my_descriptor; // Subscriber @@ -722,7 +722,7 @@ TEST_F(UDPv6Tests, simple_throughput) LocatorList_t send_locators_list; send_locators_list.push_back(sub_locator); - SendResourceList send_resource_list; + eprosima::fastdds::rtps::SendResourceList send_resource_list; ASSERT_TRUE(pub_transport.OpenOutputChannel(send_resource_list, sub_locator)); auto t0 = std::chrono::high_resolution_clock::now(); diff --git a/test/unittest/transport/mock/MockReceiverResource.cpp b/test/unittest/transport/mock/MockReceiverResource.cpp index b1542c30e94..d22d4d7126d 100644 --- a/test/unittest/transport/mock/MockReceiverResource.cpp +++ b/test/unittest/transport/mock/MockReceiverResource.cpp @@ -14,12 +14,14 @@ #include "MockReceiverResource.h" -namespace eprosima{ -namespace fastrtps{ -namespace rtps{ +namespace eprosima { +namespace fastrtps { +namespace rtps { -MockReceiverResource::MockReceiverResource(TransportInterface& transport, const Locator_t& locator) - : msg_receiver(nullptr) +MockReceiverResource::MockReceiverResource( + eprosima::fastdds::rtps::TransportInterface& transport, + const Locator_t& locator) + : msg_receiver(nullptr) { m_maxMsgSize = 0x8FFF; // Internal channel is opened and assigned to this resource. @@ -30,9 +32,14 @@ MockReceiverResource::MockReceiverResource(TransportInterface& transport, const } // Implementation functions are bound to the right transport parameters - Cleanup = [&transport, locator]() { transport.CloseInputChannel(locator); }; + Cleanup = [&transport, locator]() + { + transport.CloseInputChannel(locator); + }; LocatorMapsToManagedChannel = [&transport, locator](const Locator_t& locatorToCheck) -> bool - { return transport.DoInputLocatorsMatch(locator, locatorToCheck); }; + { + return transport.DoInputLocatorsMatch(locator, locatorToCheck); + }; } MockReceiverResource::~MockReceiverResource() @@ -55,8 +62,11 @@ MessageReceiver* MockReceiverResource::CreateMessageReceiver() return msg_receiver; } -void MockReceiverResource::OnDataReceived(const octet* buf, const uint32_t size, - const Locator_t&, const Locator_t& remote) +void MockReceiverResource::OnDataReceived( + const octet* buf, + const uint32_t size, + const Locator_t&, + const Locator_t& remote) { if (msg_receiver != nullptr) { @@ -68,12 +78,15 @@ void MockReceiverResource::OnDataReceived(const octet* buf, const uint32_t size, } } -void MockMessageReceiver::setCallback(std::function cb) +void MockMessageReceiver::setCallback( + std::function cb) { this->callback = cb; } -void MockMessageReceiver::processCDRMsg(const Locator_t&, CDRMessage_t*msg) +void MockMessageReceiver::processCDRMsg( + const Locator_t&, + CDRMessage_t* msg) { data = msg->buffer; if (callback != nullptr) diff --git a/test/unittest/transport/mock/MockReceiverResource.h b/test/unittest/transport/mock/MockReceiverResource.h index b1da38cd24a..a2c4ee4702e 100644 --- a/test/unittest/transport/mock/MockReceiverResource.h +++ b/test/unittest/transport/mock/MockReceiverResource.h @@ -17,7 +17,7 @@ #include -#include +#include #include @@ -42,7 +42,7 @@ class MockReceiverResource : public ReceiverResource const Locator_t&, const Locator_t&) override; MockReceiverResource( - TransportInterface& transport, + eprosima::fastdds::rtps::TransportInterface& transport, const Locator_t& locator); ~MockReceiverResource(); MessageReceiver* CreateMessageReceiver() override; diff --git a/test/unittest/transport/mock/MockTCPv4Transport.h b/test/unittest/transport/mock/MockTCPv4Transport.h index e2aa8e0e9b1..680dc0f73d9 100644 --- a/test/unittest/transport/mock/MockTCPv4Transport.h +++ b/test/unittest/transport/mock/MockTCPv4Transport.h @@ -15,7 +15,8 @@ #ifndef MOCK_TRANSPORT_TCP4_STUFF_H #define MOCK_TRANSPORT_TCP4_STUFF_H -#include +#include + #include namespace eprosima { @@ -31,7 +32,7 @@ class MockTCPv4Transport : public TCPv4Transport public: MockTCPv4Transport( - const TCPv4TransportDescriptor& descriptor) + const eprosima::fastdds::rtps::TCPv4TransportDescriptor& descriptor) : TCPv4Transport(descriptor) { } diff --git a/test/unittest/transport/mock/MockTCPv6Transport.h b/test/unittest/transport/mock/MockTCPv6Transport.h index cc23f039a5a..f65088d4bb4 100644 --- a/test/unittest/transport/mock/MockTCPv6Transport.h +++ b/test/unittest/transport/mock/MockTCPv6Transport.h @@ -15,7 +15,7 @@ #ifndef MOCK_TRANSPORT_TCP6_STUFF_H #define MOCK_TRANSPORT_TCP6_STUFF_H -#include +#include #include namespace eprosima { @@ -31,7 +31,7 @@ class MockTCPv6Transport : public TCPv6Transport public: MockTCPv6Transport( - const TCPv6TransportDescriptor& descriptor) + const fastdds::rtps::TCPv6TransportDescriptor& descriptor) : TCPv6Transport(descriptor) { } diff --git a/test/unittest/utils/LocatorTests.cpp b/test/unittest/utils/LocatorTests.cpp index 17719a5b5c3..3f581a17f28 100644 --- a/test/unittest/utils/LocatorTests.cpp +++ b/test/unittest/utils/LocatorTests.cpp @@ -12,15 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include -#include -#include -#include +#include #include -#include +#include +#include +#include +#include +#include +#include using namespace eprosima::fastrtps::rtps; diff --git a/test/unittest/xmlparser/SHM_transport_descriptors_config_profile.xml b/test/unittest/xmlparser/SHM_transport_descriptors_config_profile.xml index a079f97229b..5411c729ad4 100644 --- a/test/unittest/xmlparser/SHM_transport_descriptors_config_profile.xml +++ b/test/unittest/xmlparser/SHM_transport_descriptors_config_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/unittest/xmlparser/UDP_transport_descriptors_config_profile.xml b/test/unittest/xmlparser/UDP_transport_descriptors_config_profile.xml index 9a80454373f..3bf2ace35ed 100644 --- a/test/unittest/xmlparser/UDP_transport_descriptors_config_profile.xml +++ b/test/unittest/xmlparser/UDP_transport_descriptors_config_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/unittest/xmlparser/XMLEndpointParserTests.cpp b/test/unittest/xmlparser/XMLEndpointParserTests.cpp index 59ecdf722a7..c031b92a9a5 100644 --- a/test/unittest/xmlparser/XMLEndpointParserTests.cpp +++ b/test/unittest/xmlparser/XMLEndpointParserTests.cpp @@ -12,22 +12,23 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include -#include +#include +#include +#include + +#include +#include + +#include #include #include -#include #include #include -#include "../logging/mock/MockConsumer.h" - -#include -#include +#include +#include +#include -#include -#include -#include +#include "../logging/mock/MockConsumer.h" using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::rtps; diff --git a/test/unittest/xmlparser/XMLParserTests.cpp b/test/unittest/xmlparser/XMLParserTests.cpp index b36a0e383b4..36a9204fe4e 100644 --- a/test/unittest/xmlparser/XMLParserTests.cpp +++ b/test/unittest/xmlparser/XMLParserTests.cpp @@ -17,6 +17,9 @@ #include #include +#include +#include + #include #include #include @@ -28,19 +31,15 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include #include -#include - -#include - #include "../logging/mock/MockConsumer.h" #include "wrapper/XMLParserTest.hpp" @@ -89,7 +88,7 @@ TEST_F(XMLParserTests, NoFile) TEST_F(XMLParserTests, EmptyDefaultFile) { std::ifstream inFile; - inFile.open("DEFAULT_FASTRTPS_PROFILES.xml"); + inFile.open("DEFAULT_FASTDDS_PROFILES.xml"); std::unique_ptr root; ASSERT_EQ(XMLParser::loadDefaultXMLFile(root), XMLP_ret::XML_ERROR); } @@ -962,8 +961,8 @@ TEST_F(XMLParserTests, parseXMLTransportData) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parseXMLTransportData_wrapper(titleElement)); - std::shared_ptr pUDPv4Desc = - std::dynamic_pointer_cast( + std::shared_ptr pUDPv4Desc = + std::dynamic_pointer_cast( xmlparser::XMLProfileManager::getTransportById("TransportId1")); EXPECT_EQ(pUDPv4Desc->sendBufferSize, 8192u); EXPECT_EQ(pUDPv4Desc->receiveBufferSize, 8192u); @@ -991,8 +990,8 @@ TEST_F(XMLParserTests, parseXMLTransportData) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parseXMLTransportData_wrapper(titleElement)); - std::shared_ptr pUDPv6Desc = - std::dynamic_pointer_cast( + std::shared_ptr pUDPv6Desc = + std::dynamic_pointer_cast( xmlparser::XMLProfileManager::getTransportById("TransportId1")); EXPECT_EQ(pUDPv6Desc->sendBufferSize, 8192u); EXPECT_EQ(pUDPv6Desc->receiveBufferSize, 8192u); @@ -1102,8 +1101,8 @@ TEST_F(XMLParserTests, parseXMLTransportData) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parseXMLTransportData_wrapper(titleElement)); - std::shared_ptr pTCPv4Desc = - std::dynamic_pointer_cast( + std::shared_ptr pTCPv4Desc = + std::dynamic_pointer_cast( xmlparser::XMLProfileManager::getTransportById("TransportId1")); EXPECT_EQ(pTCPv4Desc->sendBufferSize, 8192u); EXPECT_EQ(pTCPv4Desc->receiveBufferSize, 8192u); @@ -1142,8 +1141,8 @@ TEST_F(XMLParserTests, parseXMLTransportData) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parseXMLTransportData_wrapper(titleElement)); - std::shared_ptr pTCPv6Desc = - std::dynamic_pointer_cast( + std::shared_ptr pTCPv6Desc = + std::dynamic_pointer_cast( xmlparser::XMLProfileManager::getTransportById("TransportId1")); EXPECT_EQ(pTCPv6Desc->sendBufferSize, 8192u); EXPECT_EQ(pTCPv6Desc->receiveBufferSize, 8192u); @@ -1989,7 +1988,7 @@ TEST_F(XMLParserTests, parseTLSConfigPositiveClauses) std::unique_ptr root; tinyxml2::XMLElement* titleElement; std::shared_ptr tcp_transport = - std::make_shared(); + std::make_shared(); // Parametrized XML const char* xml = @@ -2024,7 +2023,7 @@ TEST_F(XMLParserTests, parseTLSConfigNegativeClauses) std::unique_ptr root; tinyxml2::XMLElement* titleElement; std::shared_ptr tcp_transport = - std::make_shared(); + std::make_shared(); constexpr size_t xml_len {600}; char xml[xml_len]; @@ -2172,7 +2171,7 @@ TEST_F(XMLParserTests, parseTLSConfigHandshakeRole) std::unique_ptr root; tinyxml2::XMLElement* titleElement; std::shared_ptr tcp_transport = - std::make_shared(); + std::make_shared(); constexpr size_t xml_len {600}; char xml[xml_len]; @@ -2191,10 +2190,10 @@ TEST_F(XMLParserTests, parseTLSConfigHandshakeRole) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_EQ(descriptor->tls_config.handshake_role, - TCPTransportDescriptor::TLSConfig::TLSHandShakeRole::DEFAULT); + eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSHandShakeRole::DEFAULT); } // Check that the CLIENT setting return an xml ok code and is set correctly. @@ -2203,10 +2202,10 @@ TEST_F(XMLParserTests, parseTLSConfigHandshakeRole) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_EQ(descriptor->tls_config.handshake_role, - TCPTransportDescriptor::TLSConfig::TLSHandShakeRole::CLIENT); + eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSHandShakeRole::CLIENT); } // Check that the SERVER setting return an xml ok code and is set correctly. @@ -2215,10 +2214,10 @@ TEST_F(XMLParserTests, parseTLSConfigHandshakeRole) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_EQ(descriptor->tls_config.handshake_role, - TCPTransportDescriptor::TLSConfig::TLSHandShakeRole::SERVER); + eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSHandShakeRole::SERVER); } } @@ -2254,12 +2253,13 @@ TEST_F(XMLParserTests, parseTLSConfigVerifyMode) titleElement = xml_doc.RootElement(); std::shared_ptr tcp_transport = - std::make_shared(); + std::make_shared(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); - EXPECT_EQ(descriptor->tls_config.verify_mode, TCPTransportDescriptor::TLSConfig::TLSVerifyMode::VERIFY_NONE); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); + EXPECT_EQ(descriptor->tls_config.verify_mode, + eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSVerifyMode::VERIFY_NONE); } // Check that the VERIFY_PEER setting return an xml ok code and is set correctly. @@ -2269,12 +2269,13 @@ TEST_F(XMLParserTests, parseTLSConfigVerifyMode) titleElement = xml_doc.RootElement(); std::shared_ptr tcp_transport = - std::make_shared(); + std::make_shared(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); - EXPECT_EQ(descriptor->tls_config.verify_mode, TCPTransportDescriptor::TLSConfig::TLSVerifyMode::VERIFY_PEER); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); + EXPECT_EQ(descriptor->tls_config.verify_mode, + eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSVerifyMode::VERIFY_PEER); } // Check that the VERIFY_FAIL_IF_NO_PEER_CERT setting return an xml ok code and is set correctly. @@ -2284,13 +2285,13 @@ TEST_F(XMLParserTests, parseTLSConfigVerifyMode) titleElement = xml_doc.RootElement(); std::shared_ptr tcp_transport = - std::make_shared(); + std::make_shared(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_EQ(descriptor->tls_config.verify_mode, - TCPTransportDescriptor::TLSConfig::TLSVerifyMode::VERIFY_FAIL_IF_NO_PEER_CERT); + eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSVerifyMode::VERIFY_FAIL_IF_NO_PEER_CERT); } // Check that the VERIFY_CLIENT_ONCE setting return an xml ok code and is set correctly. @@ -2300,12 +2301,12 @@ TEST_F(XMLParserTests, parseTLSConfigVerifyMode) titleElement = xml_doc.RootElement(); std::shared_ptr tcp_transport = - std::make_shared(); + std::make_shared(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_EQ(descriptor->tls_config.verify_mode, - TCPTransportDescriptor::TLSConfig::TLSVerifyMode::VERIFY_CLIENT_ONCE); + eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSVerifyMode::VERIFY_CLIENT_ONCE); } } @@ -2327,7 +2328,7 @@ TEST_F(XMLParserTests, parseTLSConfigOptions) std::unique_ptr root; tinyxml2::XMLElement* titleElement; std::shared_ptr tcp_transport = - std::make_shared(); + std::make_shared(); constexpr size_t xml_len {600}; char xml[xml_len]; @@ -2347,10 +2348,11 @@ TEST_F(XMLParserTests, parseTLSConfigOptions) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_TRUE( - descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::DEFAULT_WORKAROUNDS)); + descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSOptions:: + DEFAULT_WORKAROUNDS)); } // Check that the NO_COMPRESSION setting return an xml ok code and is set correctly. @@ -2359,10 +2361,11 @@ TEST_F(XMLParserTests, parseTLSConfigOptions) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_TRUE( - descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_COMPRESSION)); + descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSOptions:: + NO_COMPRESSION)); } // Check that the NO_SSLV2 setting return an xml ok code and is set correctly. @@ -2371,10 +2374,11 @@ TEST_F(XMLParserTests, parseTLSConfigOptions) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_TRUE( - descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_SSLV2)); + descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSOptions:: + NO_SSLV2)); } // Check that the NO_SSLV3 setting return an xml ok code and is set correctly. @@ -2383,10 +2387,11 @@ TEST_F(XMLParserTests, parseTLSConfigOptions) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_TRUE( - descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_SSLV3)); + descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSOptions:: + NO_SSLV3)); } // Check that the NO_TLSV1 setting return an xml ok code and is set correctly. @@ -2395,10 +2400,11 @@ TEST_F(XMLParserTests, parseTLSConfigOptions) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_TRUE( - descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_TLSV1)); + descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSOptions:: + NO_TLSV1)); } // Check that the NO_TLSV1_1 setting return an xml ok code and is set correctly. @@ -2407,10 +2413,11 @@ TEST_F(XMLParserTests, parseTLSConfigOptions) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_TRUE( - descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_TLSV1_1)); + descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSOptions:: + NO_TLSV1_1)); } // Check that the NO_TLSV1_2 setting return an xml ok code and is set correctly. @@ -2419,10 +2426,11 @@ TEST_F(XMLParserTests, parseTLSConfigOptions) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_TRUE( - descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_TLSV1_2)); + descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSOptions:: + NO_TLSV1_2)); } // Check that the NO_TLSV1_3 setting return an xml ok code and is set correctly. @@ -2431,10 +2439,11 @@ TEST_F(XMLParserTests, parseTLSConfigOptions) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_TRUE( - descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_TLSV1_3)); + descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSOptions:: + NO_TLSV1_3)); } // Check that the SINGLE_DH_USE setting return an xml ok code and is set correctly. @@ -2443,10 +2452,11 @@ TEST_F(XMLParserTests, parseTLSConfigOptions) ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(xml)); titleElement = xml_doc.RootElement(); EXPECT_EQ(XMLP_ret::XML_OK, XMLParserTest::parse_tls_config_wrapper(titleElement, tcp_transport)); - std::shared_ptr descriptor = - std::dynamic_pointer_cast(tcp_transport); + std::shared_ptr descriptor = + std::dynamic_pointer_cast(tcp_transport); EXPECT_TRUE( - descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::SINGLE_DH_USE)); + descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSOptions:: + SINGLE_DH_USE)); } } @@ -3071,7 +3081,7 @@ TEST_F(XMLParserTests, parseXMLReceptionThreads) std::string title; std::string xml; xmlparser::XMLP_ret result; - PortBasedTransportDescriptor::ReceptionThreadsConfigMap threads_config; + eprosima::fastdds::rtps::PortBasedTransportDescriptor::ReceptionThreadsConfigMap threads_config; }; ThreadSettings modified_thread_settings; @@ -3181,7 +3191,7 @@ TEST_F(XMLParserTests, parseXMLReceptionThreads) tinyxml2::XMLDocument xml_doc; std::unique_ptr root; tinyxml2::XMLElement* titleElement; - PortBasedTransportDescriptor::ReceptionThreadsConfigMap reception_threads; + eprosima::fastdds::rtps::PortBasedTransportDescriptor::ReceptionThreadsConfigMap reception_threads; ASSERT_EQ(tinyxml2::XMLError::XML_SUCCESS, xml_doc.Parse(test_case.xml.c_str())) << "test_case = [" << test_case.title << "]"; diff --git a/test/unittest/xmlparser/XMLProfileParserTests.cpp b/test/unittest/xmlparser/XMLProfileParserTests.cpp index 74de575eab8..aa5cce74594 100644 --- a/test/unittest/xmlparser/XMLProfileParserTests.cpp +++ b/test/unittest/xmlparser/XMLProfileParserTests.cpp @@ -32,8 +32,8 @@ #include #include #include -#include -#include +#include +#include #include #include @@ -1667,8 +1667,8 @@ TEST_F(XMLProfileParserBasicTests, tls_config) xmlparser::sp_transport_t transport = xmlparser::XMLProfileManager::getTransportById("Test"); - using TCPDescriptor = std::shared_ptr; - TCPDescriptor descriptor = std::dynamic_pointer_cast(transport); + using TCPDescriptor = std::shared_ptr; + TCPDescriptor descriptor = std::dynamic_pointer_cast(transport); /* @@ -1692,16 +1692,26 @@ TEST_F(XMLProfileParserBasicTests, tls_config) EXPECT_EQ("DH.pem", descriptor->tls_config.tmp_dh_file); EXPECT_EQ("verify.pem", descriptor->tls_config.verify_file); EXPECT_EQ("my_server.com", descriptor->tls_config.server_name); - EXPECT_EQ(TCPTransportDescriptor::TLSConfig::TLSVerifyMode::VERIFY_PEER, descriptor->tls_config.verify_mode); - EXPECT_TRUE(descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_TLSV1)); - EXPECT_TRUE(descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_TLSV1_1)); - EXPECT_FALSE(descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_SSLV2)); - EXPECT_FALSE(descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_SSLV3)); - EXPECT_FALSE(descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_TLSV1_2)); - EXPECT_FALSE(descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_TLSV1_3)); - EXPECT_FALSE(descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::DEFAULT_WORKAROUNDS)); - EXPECT_FALSE(descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::NO_COMPRESSION)); - EXPECT_FALSE(descriptor->tls_config.get_option(TCPTransportDescriptor::TLSConfig::TLSOptions::SINGLE_DH_USE)); + EXPECT_EQ(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSVerifyMode::VERIFY_PEER, + descriptor->tls_config.verify_mode); + EXPECT_TRUE(descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSOptions + ::NO_TLSV1)); + EXPECT_TRUE(descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSOptions + ::NO_TLSV1_1)); + EXPECT_FALSE(descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig:: + TLSOptions::NO_SSLV2)); + EXPECT_FALSE(descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig:: + TLSOptions::NO_SSLV3)); + EXPECT_FALSE(descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig:: + TLSOptions::NO_TLSV1_2)); + EXPECT_FALSE(descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig:: + TLSOptions::NO_TLSV1_3)); + EXPECT_FALSE(descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig:: + TLSOptions::DEFAULT_WORKAROUNDS)); + EXPECT_FALSE(descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig:: + TLSOptions::NO_COMPRESSION)); + EXPECT_FALSE(descriptor->tls_config.get_option(eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig:: + TLSOptions::SINGLE_DH_USE)); EXPECT_EQ(descriptor->tls_config.verify_paths.size(), static_cast(3)); EXPECT_EQ(descriptor->tls_config.verify_paths[0], "Path1"); @@ -1710,7 +1720,8 @@ TEST_F(XMLProfileParserBasicTests, tls_config) EXPECT_EQ(descriptor->tls_config.verify_depth, static_cast(55)); EXPECT_TRUE(descriptor->tls_config.default_verify_path); - EXPECT_EQ(descriptor->tls_config.handshake_role, TCPTransportDescriptor::TLSConfig::TLSHandShakeRole::SERVER); + EXPECT_EQ(descriptor->tls_config.handshake_role, + eprosima::fastdds::rtps::TCPTransportDescriptor::TLSConfig::TLSHandShakeRole::SERVER); } TEST_F(XMLProfileParserBasicTests, UDP_transport_descriptors_config) @@ -1722,8 +1733,8 @@ TEST_F(XMLProfileParserBasicTests, UDP_transport_descriptors_config) xmlparser::sp_transport_t transport = xmlparser::XMLProfileManager::getTransportById("Test"); - using UDPDescriptor = std::shared_ptr; - UDPDescriptor descriptor = std::dynamic_pointer_cast(transport); + using UDPDescriptor = std::shared_ptr; + UDPDescriptor descriptor = std::dynamic_pointer_cast(transport); ASSERT_NE(descriptor, nullptr); EXPECT_EQ(descriptor->sendBufferSize, 8192u); @@ -2074,7 +2085,7 @@ TEST_F(XMLProfileParserBasicTests, skip_default_xml) "; tinyxml2::XMLDocument xml_doc; xml_doc.Parse(xml); - xml_doc.SaveFile("DEFAULT_FASTRTPS_PROFILES.xml"); + xml_doc.SaveFile("DEFAULT_FASTDDS_PROFILES.xml"); #ifdef _WIN32 _putenv_s("SKIP_DEFAULT_XML_FILE", "1"); @@ -2094,13 +2105,13 @@ TEST_F(XMLProfileParserBasicTests, skip_default_xml) xmlparser::XMLProfileManager::loadDefaultXMLFile(); xmlparser::XMLProfileManager::getDefaultParticipantAttributes(participant_atts_default); - remove("DEFAULT_FASTRTPS_PROFILES.xml"); + remove("DEFAULT_FASTDDS_PROFILES.xml"); EXPECT_NE(participant_atts_none.domainId, participant_atts_default.domainId); } /* - * Tests whether the FASTRTPS_DEFAULT_PROFILES_FILE environment file correctly loads the selected file as default. + * Tests whether the FASTDDS_DEFAULT_PROFILES_FILE environment file correctly loads the selected file as default. * - participant_atts_default contains the attributes in the default file in this folder. * - participant_atts_file contains the attributes in the default file created by the test. */ @@ -2117,21 +2128,21 @@ TEST_F(XMLProfileParserBasicTests, default_env_variable) "; tinyxml2::XMLDocument xml_doc; xml_doc.Parse(xml); - xml_doc.SaveFile("FASTRTPS_PROFILES.xml"); + xml_doc.SaveFile("FASTDDS_PROFILES.xml"); ParticipantAttributes participant_atts_default; xmlparser::XMLProfileManager::loadDefaultXMLFile(); xmlparser::XMLProfileManager::getDefaultParticipantAttributes(participant_atts_default); #ifdef _WIN32 - _putenv_s("FASTRTPS_DEFAULT_PROFILES_FILE", "FASTRTPS_PROFILES.xml"); + _putenv_s("FASTDDS_DEFAULT_PROFILES_FILE", "FASTDDS_PROFILES.xml"); #else - setenv("FASTRTPS_DEFAULT_PROFILES_FILE", "FASTRTPS_PROFILES.xml", 1); + setenv("FASTDDS_DEFAULT_PROFILES_FILE", "FASTDDS_PROFILES.xml", 1); #endif // ifdef _WIN32 ParticipantAttributes participant_atts_file; xmlparser::XMLProfileManager::loadDefaultXMLFile(); xmlparser::XMLProfileManager::getDefaultParticipantAttributes(participant_atts_file); - remove("FASTRTPS_PROFILES.xml"); + remove("FASTDDS_PROFILES.xml"); EXPECT_NE(participant_atts_file.domainId, participant_atts_default.domainId); } @@ -3232,7 +3243,7 @@ TEST_F(XMLProfileParserBasicTests, log_thread_settings_qos) "log_thread_settings_ok", R"( - + -1 @@ -3248,7 +3259,7 @@ TEST_F(XMLProfileParserBasicTests, log_thread_settings_qos) "log_thread_settings_duplicate", R"( - + -1 @@ -3270,7 +3281,7 @@ TEST_F(XMLProfileParserBasicTests, log_thread_settings_qos) "log_thread_settings_wrong", R"( - + -1 @@ -3325,7 +3336,7 @@ TEST_F(XMLProfileParserBasicTests, domainparticipantfactory) "entity_factory_ok", R"( - + @@ -3345,7 +3356,7 @@ TEST_F(XMLProfileParserBasicTests, domainparticipantfactory) "shm_watchdog_thread_ok", R"( - + @@ -3368,7 +3379,7 @@ TEST_F(XMLProfileParserBasicTests, domainparticipantfactory) "file_watch_threads_ok", R"( - + @@ -3391,7 +3402,7 @@ TEST_F(XMLProfileParserBasicTests, domainparticipantfactory) "all_present_ok", R"( - + @@ -3423,7 +3434,7 @@ TEST_F(XMLProfileParserBasicTests, domainparticipantfactory) "qos_duplicated", R"( - + @@ -3448,7 +3459,7 @@ TEST_F(XMLProfileParserBasicTests, domainparticipantfactory) "entity_factory_wrong_tag", R"( - + @@ -3468,7 +3479,7 @@ TEST_F(XMLProfileParserBasicTests, domainparticipantfactory) "entity_factory_duplicated_autoenable_created_entities_tag", R"( - + @@ -3489,7 +3500,7 @@ TEST_F(XMLProfileParserBasicTests, domainparticipantfactory) "entity_factory_duplicated_autoenable_created_entities_and_wrong_tag", R"( - + @@ -3510,7 +3521,7 @@ TEST_F(XMLProfileParserBasicTests, domainparticipantfactory) "entity_factory_duplicated", R"( - + @@ -3545,7 +3556,7 @@ TEST_F(XMLProfileParserBasicTests, domainparticipantfactory) "shm_watchdog_thread_duplicated", R"( - + @@ -3583,7 +3594,7 @@ TEST_F(XMLProfileParserBasicTests, domainparticipantfactory) "file_watch_threads_duplicated", R"( - + @@ -3677,7 +3688,7 @@ TEST_F(XMLProfileParserBasicTests, participant_thread_settings) "builtin_controllers_sender_thread_ok", R"( - + @@ -3704,7 +3715,7 @@ TEST_F(XMLProfileParserBasicTests, participant_thread_settings) "builtin_controllers_sender_thread_nok", R"( - + @@ -3731,7 +3742,7 @@ TEST_F(XMLProfileParserBasicTests, participant_thread_settings) "timed_events_thread_ok", R"( - + @@ -3758,7 +3769,7 @@ TEST_F(XMLProfileParserBasicTests, participant_thread_settings) "timed_events_thread_nok", R"( - + @@ -3785,7 +3796,7 @@ TEST_F(XMLProfileParserBasicTests, participant_thread_settings) "discovery_server_thread_ok", R"( - + @@ -3812,7 +3823,7 @@ TEST_F(XMLProfileParserBasicTests, participant_thread_settings) "discovery_server_thread_nok", R"( - + @@ -3839,7 +3850,7 @@ TEST_F(XMLProfileParserBasicTests, participant_thread_settings) "builtin_transports_reception_threads_ok", R"( - + @@ -3866,7 +3877,7 @@ TEST_F(XMLProfileParserBasicTests, participant_thread_settings) "builtin_transports_reception_threads_nok", R"( - + @@ -3894,7 +3905,7 @@ TEST_F(XMLProfileParserBasicTests, participant_thread_settings) "security_log_thread_ok", R"( - + @@ -3919,7 +3930,7 @@ TEST_F(XMLProfileParserBasicTests, participant_thread_settings) "security_log_thread_nok", R"( - + @@ -4000,7 +4011,7 @@ TEST_F(XMLProfileParserBasicTests, datareader_thread_settings) "data_sharing_listener_thread_ok", R"( - + @@ -4024,7 +4035,7 @@ TEST_F(XMLProfileParserBasicTests, datareader_thread_settings) "data_sharing_listener_thread_empty", R"( - + @@ -4044,7 +4055,7 @@ TEST_F(XMLProfileParserBasicTests, datareader_thread_settings) "no_data_sharing_listener_thread", R"( - + @@ -4062,7 +4073,7 @@ TEST_F(XMLProfileParserBasicTests, datareader_thread_settings) "data_sharing_listener_thread_wrong_value", R"( - + @@ -4086,7 +4097,7 @@ TEST_F(XMLProfileParserBasicTests, datareader_thread_settings) "data_sharing_listener_thread_wrong_tag", R"( - + diff --git a/test/unittest/xmlparser/log_def_file_profile.xml b/test/unittest/xmlparser/log_def_file_profile.xml index 38b052a081c..75d4e306f48 100644 --- a/test/unittest/xmlparser/log_def_file_profile.xml +++ b/test/unittest/xmlparser/log_def_file_profile.xml @@ -1,5 +1,5 @@ - + TRUE diff --git a/test/unittest/xmlparser/log_inactive_profile.xml b/test/unittest/xmlparser/log_inactive_profile.xml index 2039beb7893..c0ec35418f7 100644 --- a/test/unittest/xmlparser/log_inactive_profile.xml +++ b/test/unittest/xmlparser/log_inactive_profile.xml @@ -1,5 +1,5 @@ - + FALSE diff --git a/test/unittest/xmlparser/log_node_file_append_profile.xml b/test/unittest/xmlparser/log_node_file_append_profile.xml index 635690b99fc..abab527ad4a 100644 --- a/test/unittest/xmlparser/log_node_file_append_profile.xml +++ b/test/unittest/xmlparser/log_node_file_append_profile.xml @@ -1,5 +1,5 @@ - + FALSE diff --git a/test/unittest/xmlparser/log_stdouterr_profile.xml b/test/unittest/xmlparser/log_stdouterr_profile.xml index 7faf82121d2..e9df184dd96 100644 --- a/test/unittest/xmlparser/log_stdouterr_profile.xml +++ b/test/unittest/xmlparser/log_stdouterr_profile.xml @@ -1,5 +1,5 @@ - + FALSE diff --git a/test/unittest/xmlparser/log_stdouterr_two_thresholds_profile.xml b/test/unittest/xmlparser/log_stdouterr_two_thresholds_profile.xml index d543dd93d21..bc19a1a9b81 100644 --- a/test/unittest/xmlparser/log_stdouterr_two_thresholds_profile.xml +++ b/test/unittest/xmlparser/log_stdouterr_two_thresholds_profile.xml @@ -1,5 +1,5 @@ - + FALSE diff --git a/test/unittest/xmlparser/log_stdouterr_wrong_property_name_profile_invalid.xml b/test/unittest/xmlparser/log_stdouterr_wrong_property_name_profile_invalid.xml index dd0d194e9ff..86f63abb28a 100644 --- a/test/unittest/xmlparser/log_stdouterr_wrong_property_name_profile_invalid.xml +++ b/test/unittest/xmlparser/log_stdouterr_wrong_property_name_profile_invalid.xml @@ -1,5 +1,5 @@ - + FALSE diff --git a/test/unittest/xmlparser/log_stdouterr_wrong_property_value_profile_invalid.xml b/test/unittest/xmlparser/log_stdouterr_wrong_property_value_profile_invalid.xml index e6ae3b47e5e..a12f037253c 100644 --- a/test/unittest/xmlparser/log_stdouterr_wrong_property_value_profile_invalid.xml +++ b/test/unittest/xmlparser/log_stdouterr_wrong_property_value_profile_invalid.xml @@ -1,5 +1,5 @@ - + FALSE diff --git a/test/unittest/xmlparser/regressions/simple_participant_profiles_nok.xml b/test/unittest/xmlparser/regressions/simple_participant_profiles_nok.xml index 6c8f945c202..87a11151c4b 100644 --- a/test/unittest/xmlparser/regressions/simple_participant_profiles_nok.xml +++ b/test/unittest/xmlparser/regressions/simple_participant_profiles_nok.xml @@ -1,5 +1,5 @@ - + 1 diff --git a/test/unittest/xmlparser/regressions/simple_participant_profiles_ok.xml b/test/unittest/xmlparser/regressions/simple_participant_profiles_ok.xml index ef1729dde01..660706c1f02 100644 --- a/test/unittest/xmlparser/regressions/simple_participant_profiles_ok.xml +++ b/test/unittest/xmlparser/regressions/simple_participant_profiles_ok.xml @@ -1,5 +1,5 @@ - + diff --git a/test/unittest/xmlparser/test_xml_deprecated.xml b/test/unittest/xmlparser/test_xml_deprecated.xml index 99ead8f8282..193251845af 100644 --- a/test/unittest/xmlparser/test_xml_deprecated.xml +++ b/test/unittest/xmlparser/test_xml_deprecated.xml @@ -1,5 +1,5 @@ - + 2019102 diff --git a/test/unittest/xmlparser/test_xml_duration_profile.xml b/test/unittest/xmlparser/test_xml_duration_profile.xml index 8829d39f714..e9cafefa7ff 100644 --- a/test/unittest/xmlparser/test_xml_duration_profile.xml +++ b/test/unittest/xmlparser/test_xml_duration_profile.xml @@ -1,5 +1,5 @@ - + 80 diff --git a/test/unittest/xmlparser/test_xml_profile.xml b/test/unittest/xmlparser/test_xml_profile.xml index fa9207f9c52..697244969c3 100644 --- a/test/unittest/xmlparser/test_xml_profile.xml +++ b/test/unittest/xmlparser/test_xml_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/unittest/xmlparser/test_xml_profile_env_var.xml b/test/unittest/xmlparser/test_xml_profile_env_var.xml index 63a4deb22b7..9c0fd41c471 100644 --- a/test/unittest/xmlparser/test_xml_profile_env_var.xml +++ b/test/unittest/xmlparser/test_xml_profile_env_var.xml @@ -1,5 +1,5 @@ - + ${XML_PROFILES_ENV_VAR_1} diff --git a/test/unittest/xmlparser/test_xml_root_library_settings_profile.xml b/test/unittest/xmlparser/test_xml_root_library_settings_profile.xml index 38b4b0f3d78..6edb9e2d25b 100644 --- a/test/unittest/xmlparser/test_xml_root_library_settings_profile.xml +++ b/test/unittest/xmlparser/test_xml_root_library_settings_profile.xml @@ -1,5 +1,5 @@ - + USER_DATA_ONLY diff --git a/test/unittest/xmlparser/test_xml_rooted_deprecated.xml b/test/unittest/xmlparser/test_xml_rooted_deprecated.xml index 79d773dfba8..db67a690cc1 100644 --- a/test/unittest/xmlparser/test_xml_rooted_deprecated.xml +++ b/test/unittest/xmlparser/test_xml_rooted_deprecated.xml @@ -1,5 +1,5 @@ - + diff --git a/test/unittest/xmlparser/test_xml_rooted_profile.xml b/test/unittest/xmlparser/test_xml_rooted_profile.xml index b6e95e1751e..84195cf4a1a 100644 --- a/test/unittest/xmlparser/test_xml_rooted_profile.xml +++ b/test/unittest/xmlparser/test_xml_rooted_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/unittest/xmlparser/test_xml_security_profile.xml b/test/unittest/xmlparser/test_xml_security_profile.xml index 644b35a7da7..825f678f5cb 100644 --- a/test/unittest/xmlparser/test_xml_security_profile.xml +++ b/test/unittest/xmlparser/test_xml_security_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/unittest/xmlparser/tls_config_profile.xml b/test/unittest/xmlparser/tls_config_profile.xml index 5944cdc4b03..e04382f07e7 100644 --- a/test/unittest/xmlparser/tls_config_profile.xml +++ b/test/unittest/xmlparser/tls_config_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/test/unittest/xtypes/XTypesTests.cpp b/test/unittest/xtypes/XTypesTests.cpp index d32886e3322..9961f876c39 100644 --- a/test/unittest/xtypes/XTypesTests.cpp +++ b/test/unittest/xtypes/XTypesTests.cpp @@ -12,14 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include -#include -#include "idl/TypesTypeObject.h" -#include "idl/WideEnumTypeObject.h" #include + +#include +#include #include #include +#include + +#include "idl/TypesTypeObject.h" +#include "idl/WideEnumTypeObject.h" using namespace eprosima::fastrtps; using namespace eprosima::fastrtps::types; @@ -48,7 +50,7 @@ class XTypesTests : public ::testing::Test TEST_F(XTypesTests, EnumMinimalCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* my_enum = GetMinimalMyEnumStructObject(); const TypeObject* my_bad_enum = GetMinimalMyBadEnumStructObject(); const TypeObject* my_wide_enum = GetMinimalMyEnumWideStructObject(); @@ -59,7 +61,7 @@ TEST_F(XTypesTests, EnumMinimalCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(my_enum->consistent(*my_enum, consistencyQos)); @@ -83,7 +85,7 @@ TEST_F(XTypesTests, EnumMinimalCoercion) TEST_F(XTypesTests, EnumCompleteCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* my_enum = GetCompleteMyEnumStructObject(); const TypeObject* my_bad_enum = GetCompleteMyBadEnumStructObject(); const TypeObject* my_wide_enum = GetCompleteMyEnumWideStructObject(); @@ -94,7 +96,7 @@ TEST_F(XTypesTests, EnumCompleteCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(my_enum->consistent(*my_enum, consistencyQos)); @@ -118,7 +120,7 @@ TEST_F(XTypesTests, EnumCompleteCoercion) TEST_F(XTypesTests, AliasMinimalCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* my_enum = GetMinimalMyEnumStructObject(); const TypeObject* my_alias_enum = GetMinimalMyAliasEnumStructObject(); @@ -128,7 +130,7 @@ TEST_F(XTypesTests, AliasMinimalCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(my_enum->consistent(*my_alias_enum, consistencyQos)); @@ -143,7 +145,7 @@ TEST_F(XTypesTests, AliasMinimalCoercion) TEST_F(XTypesTests, AliasCompleteCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* my_enum = GetCompleteMyEnumStructObject(); const TypeObject* my_alias_enum = GetCompleteMyAliasEnumStructObject(); @@ -153,7 +155,7 @@ TEST_F(XTypesTests, AliasCompleteCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(my_enum->consistent(*my_alias_enum, consistencyQos)); @@ -168,7 +170,7 @@ TEST_F(XTypesTests, AliasCompleteCoercion) TEST_F(XTypesTests, BasicStructMinimalCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* basic_struct = GetMinimalBasicStructObject(); const TypeObject* basic_names_struct = GetMinimalBasicNamesStructObject(); const TypeObject* basic_bad_struct = GetMinimalBasicBadStructObject(); @@ -181,7 +183,7 @@ TEST_F(XTypesTests, BasicStructMinimalCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(basic_struct->consistent(*basic_names_struct, consistencyQos)); @@ -206,7 +208,7 @@ TEST_F(XTypesTests, BasicStructMinimalCoercion) ASSERT_FALSE(basic_wide_bad_struct->consistent(*basic_struct, consistencyQos)); // DISALLOW coercion - consistencyQos.m_kind = DISALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::DISALLOW_TYPE_COERCION; ASSERT_FALSE(basic_struct->consistent(*basic_wide_struct, consistencyQos)); ASSERT_FALSE(basic_wide_struct->consistent(*basic_struct, consistencyQos)); } @@ -214,7 +216,7 @@ TEST_F(XTypesTests, BasicStructMinimalCoercion) TEST_F(XTypesTests, BasicStructCompleteCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* basic_struct = GetCompleteBasicStructObject(); const TypeObject* basic_names_struct = GetCompleteBasicNamesStructObject(); const TypeObject* basic_bad_struct = GetCompleteBasicBadStructObject(); @@ -227,7 +229,7 @@ TEST_F(XTypesTests, BasicStructCompleteCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(basic_struct->consistent(*basic_names_struct, consistencyQos)); @@ -252,7 +254,7 @@ TEST_F(XTypesTests, BasicStructCompleteCoercion) ASSERT_FALSE(basic_wide_bad_struct->consistent(*basic_struct, consistencyQos)); // DISALLOW coercion - consistencyQos.m_kind = DISALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::DISALLOW_TYPE_COERCION; ASSERT_FALSE(basic_struct->consistent(*basic_wide_struct, consistencyQos)); ASSERT_FALSE(basic_wide_struct->consistent(*basic_struct, consistencyQos)); } @@ -260,7 +262,7 @@ TEST_F(XTypesTests, BasicStructCompleteCoercion) TEST_F(XTypesTests, StringMinimalCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* my_string = GetMinimalStringStructObject(); const TypeObject* my_lstring = GetMinimalLargeStringStructObject(); const TypeObject* my_wstring = GetMinimalWStringStructObject(); @@ -272,7 +274,7 @@ TEST_F(XTypesTests, StringMinimalCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(my_string->consistent(*my_lstring, consistencyQos)); @@ -303,7 +305,7 @@ TEST_F(XTypesTests, StringMinimalCoercion) TEST_F(XTypesTests, StringCompleteCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* my_string = GetCompleteStringStructObject(); const TypeObject* my_lstring = GetCompleteLargeStringStructObject(); const TypeObject* my_wstring = GetCompleteWStringStructObject(); @@ -315,7 +317,7 @@ TEST_F(XTypesTests, StringCompleteCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(my_string->consistent(*my_lstring, consistencyQos)); @@ -346,7 +348,7 @@ TEST_F(XTypesTests, StringCompleteCoercion) TEST_F(XTypesTests, ArrayMinimalCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* my_array = GetMinimalArrayStructObject(); const TypeObject* my_array_equal = GetMinimalArrayStructEqualObject(); const TypeObject* my_array_bad = GetMinimalArrayBadStructObject(); @@ -359,7 +361,7 @@ TEST_F(XTypesTests, ArrayMinimalCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(my_array->consistent(*my_array_equal, consistencyQos)); @@ -379,7 +381,7 @@ TEST_F(XTypesTests, ArrayMinimalCoercion) TEST_F(XTypesTests, ArrayCompleteCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* my_array = GetCompleteArrayStructObject(); const TypeObject* my_array_equal = GetCompleteArrayStructEqualObject(); const TypeObject* my_array_bad = GetCompleteArrayBadStructObject(); @@ -392,7 +394,7 @@ TEST_F(XTypesTests, ArrayCompleteCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(my_array->consistent(*my_array_equal, consistencyQos)); @@ -412,7 +414,7 @@ TEST_F(XTypesTests, ArrayCompleteCoercion) TEST_F(XTypesTests, SequenceMinimalCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* my_sequence = GetMinimalSequenceStructObject(); const TypeObject* my_sequence_equal = GetMinimalSequenceStructEqualObject(); const TypeObject* my_sequence_bad = GetMinimalSequenceBadStructObject(); @@ -426,7 +428,7 @@ TEST_F(XTypesTests, SequenceMinimalCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(my_sequence->consistent(*my_sequence_equal, consistencyQos)); @@ -464,7 +466,7 @@ TEST_F(XTypesTests, SequenceMinimalCoercion) TEST_F(XTypesTests, SequenceCompleteCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* my_sequence = GetCompleteSequenceStructObject(); const TypeObject* my_sequence_equal = GetCompleteSequenceStructEqualObject(); const TypeObject* my_sequence_bad = GetCompleteSequenceBadStructObject(); @@ -478,7 +480,7 @@ TEST_F(XTypesTests, SequenceCompleteCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(my_sequence->consistent(*my_sequence_equal, consistencyQos)); @@ -516,7 +518,7 @@ TEST_F(XTypesTests, SequenceCompleteCoercion) TEST_F(XTypesTests, MapMinimalCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* my_map = GetMinimalMapStructObject(); const TypeObject* my_map_equal = GetMinimalMapStructEqualObject(); const TypeObject* my_map_bad_key = GetMinimalMapBadKeyStructObject(); @@ -531,7 +533,7 @@ TEST_F(XTypesTests, MapMinimalCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(my_map->consistent(*my_map_equal, consistencyQos)); @@ -572,7 +574,7 @@ TEST_F(XTypesTests, MapMinimalCoercion) TEST_F(XTypesTests, MapCompleteCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* my_map = GetCompleteMapStructObject(); const TypeObject* my_map_equal = GetCompleteMapStructEqualObject(); const TypeObject* my_map_bad_key = GetCompleteMapBadKeyStructObject(); @@ -587,7 +589,7 @@ TEST_F(XTypesTests, MapCompleteCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(my_map->consistent(*my_map_equal, consistencyQos)); @@ -628,7 +630,7 @@ TEST_F(XTypesTests, MapCompleteCoercion) TEST_F(XTypesTests, SimpleUnionMinimalCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* basic_union = GetMinimalSimpleUnionStructObject(); const TypeObject* basic_union_equal = GetMinimalSimpleUnionStructEqualObject(); const TypeObject* basic_union_names = GetMinimalSimpleUnionNamesStructObject(); @@ -643,7 +645,7 @@ TEST_F(XTypesTests, SimpleUnionMinimalCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(basic_union->consistent(*basic_union_equal, consistencyQos)); @@ -675,7 +677,7 @@ TEST_F(XTypesTests, SimpleUnionMinimalCoercion) ASSERT_FALSE(basic_wide_union->consistent(*basic_union, consistencyQos)); // DISALLOW coercion - consistencyQos.m_kind = DISALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::DISALLOW_TYPE_COERCION; ASSERT_FALSE(basic_union->consistent(*basic_wide_union, consistencyQos)); ASSERT_FALSE(basic_wide_union->consistent(*basic_union, consistencyQos)); } @@ -683,7 +685,7 @@ TEST_F(XTypesTests, SimpleUnionMinimalCoercion) TEST_F(XTypesTests, SimpleUnionCompleteCoercion) { // Get Struct TypeObjects (always test struct to test the aliases and types hierarchy) - TypeConsistencyEnforcementQosPolicy consistencyQos; + eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy consistencyQos; const TypeObject* basic_union = GetCompleteSimpleUnionStructObject(); const TypeObject* basic_union_equal = GetCompleteSimpleUnionStructEqualObject(); const TypeObject* basic_union_names = GetCompleteSimpleUnionNamesStructObject(); @@ -698,7 +700,7 @@ TEST_F(XTypesTests, SimpleUnionCompleteCoercion) consistencyQos.m_ignore_sequence_bounds = true; consistencyQos.m_ignore_string_bounds = true; consistencyQos.m_prevent_type_widening = false; - consistencyQos.m_kind = ALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::ALLOW_TYPE_COERCION; // Check results ASSERT_TRUE(basic_union->consistent(*basic_union_equal, consistencyQos)); @@ -730,7 +732,7 @@ TEST_F(XTypesTests, SimpleUnionCompleteCoercion) ASSERT_FALSE(basic_wide_union->consistent(*basic_union, consistencyQos)); // DISALLOW coercion - consistencyQos.m_kind = DISALLOW_TYPE_COERCION; + consistencyQos.m_kind = eprosima::fastdds::dds::DISALLOW_TYPE_COERCION; ASSERT_FALSE(basic_union->consistent(*basic_wide_union, consistencyQos)); ASSERT_FALSE(basic_wide_union->consistent(*basic_union, consistencyQos)); } diff --git a/test/xtypes/CMakeLists.txt b/test/xtypes/CMakeLists.txt index 1719a3fdead..35620b51bf4 100644 --- a/test/xtypes/CMakeLists.txt +++ b/test/xtypes/CMakeLists.txt @@ -40,5 +40,5 @@ target_compile_definitions(XTypesBlackBoxTests PRIVATE $<$:__INTERNALDEBUG> # Internal debug activated. ) target_include_directories(XTypesBlackBoxTests PRIVATE ${Asio_INCLUDE_DIR}) -target_link_libraries(XTypesBlackBoxTests fastrtps fastcdr GTest::gtest) +target_link_libraries(XTypesBlackBoxTests fastdds fastcdr GTest::gtest) gtest_discover_tests(XTypesBlackBoxTests) diff --git a/test/xtypes/TestPublisher.cpp b/test/xtypes/TestPublisher.cpp index 5076ee6eda4..399990f6124 100644 --- a/test/xtypes/TestPublisher.cpp +++ b/test/xtypes/TestPublisher.cpp @@ -22,7 +22,6 @@ #include #include - #include #include @@ -31,13 +30,10 @@ #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include @@ -72,7 +68,7 @@ bool TestPublisher::init( const eprosima::fastrtps::types::TypeIdentifier* type_identifier, const eprosima::fastrtps::types::TypeInformation* type_info, const std::string& name, - const eprosima::fastrtps::DataRepresentationQosPolicy* dataRepresentationQos, + const eprosima::fastdds::dds::DataRepresentationQosPolicy* dataRepresentationQos, bool use_typelookup) { m_Name = name; diff --git a/test/xtypes/TestPublisher.h b/test/xtypes/TestPublisher.h index 5eef5b1359b..ccf9bf6cfe4 100644 --- a/test/xtypes/TestPublisher.h +++ b/test/xtypes/TestPublisher.h @@ -20,19 +20,19 @@ #ifndef _TEST_PUBLISHER_H_ #define _TEST_PUBLISHER_H_ -#include -#include +#include +#include + #include #include -#include #include +#include #include +#include #include -#include -#include +#include +#include #include -#include -#include class TestPublisher { @@ -51,7 +51,7 @@ class TestPublisher const eprosima::fastrtps::types::TypeIdentifier* type_identifier, const eprosima::fastrtps::types::TypeInformation* type_info, const std::string& name, - const eprosima::fastrtps::DataRepresentationQosPolicy* dataRepresentationQos, + const eprosima::fastdds::dds::DataRepresentationQosPolicy* dataRepresentationQos, bool use_typelookup = false); //!Publish a sample @@ -144,7 +144,7 @@ class TestPublisher class PartListener : public eprosima::fastdds::dds::DomainParticipantListener { -public: + public: PartListener( TestPublisher* parent) @@ -174,11 +174,12 @@ class TestPublisher TestPublisher* parent_; std::atomic discovered_; - } part_listener_; + } + part_listener_; class PubListener : public eprosima::fastdds::dds::DataWriterListener { -public: + public: PubListener() { @@ -197,7 +198,8 @@ class TestPublisher TestPublisher* mParent; int n_matched; - } m_pubListener; + } + m_pubListener; void runThread(); }; diff --git a/test/xtypes/TestSubscriber.cpp b/test/xtypes/TestSubscriber.cpp index b524fba7a7e..a1bbb453897 100644 --- a/test/xtypes/TestSubscriber.cpp +++ b/test/xtypes/TestSubscriber.cpp @@ -18,26 +18,23 @@ */ #include "TestSubscriber.h" -#include + +#include +#include + #include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include -#include #include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include - - -#include using namespace eprosima::fastdds::dds; using namespace eprosima::fastrtps; @@ -67,8 +64,8 @@ bool TestSubscriber::init( const eprosima::fastrtps::types::TypeIdentifier* type_identifier, const eprosima::fastrtps::types::TypeInformation* type_info, const std::string& name, - const eprosima::fastrtps::DataRepresentationQosPolicy* dataRepresentationQos, - const eprosima::fastrtps::TypeConsistencyEnforcementQosPolicy* typeConsistencyQos, + const eprosima::fastdds::dds::DataRepresentationQosPolicy* dataRepresentationQos, + const eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy* typeConsistencyQos, bool use_typelookup) { dataRepresentationQos_ = dataRepresentationQos; diff --git a/test/xtypes/TestSubscriber.h b/test/xtypes/TestSubscriber.h index 35476289132..21e54e0f4ce 100644 --- a/test/xtypes/TestSubscriber.h +++ b/test/xtypes/TestSubscriber.h @@ -20,20 +20,19 @@ #ifndef _TEST_SUBSCRIBER_H_ #define _TEST_SUBSCRIBER_H_ -#include -#include +#include +#include + #include #include -#include #include +#include #include +#include #include -#include +#include +#include #include -#include - -#include -#include class TestSubscriber { @@ -52,8 +51,8 @@ class TestSubscriber const eprosima::fastrtps::types::TypeIdentifier* type_identifier, const eprosima::fastrtps::types::TypeInformation* type_info, const std::string& name, - const eprosima::fastrtps::DataRepresentationQosPolicy* dataRepresentationQos, - const eprosima::fastrtps::TypeConsistencyEnforcementQosPolicy* typeConsistencyQos, + const eprosima::fastdds::dds::DataRepresentationQosPolicy* dataRepresentationQos, + const eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy* typeConsistencyQos, bool use_typelookup = false); //!RUN the subscriber @@ -117,14 +116,14 @@ class TestSubscriber bool using_typelookup_; bool tls_callback_called_; std::string topic_name_; - const eprosima::fastrtps::DataRepresentationQosPolicy* dataRepresentationQos_; - const eprosima::fastrtps::TypeConsistencyEnforcementQosPolicy* typeConsistencyQos_; + const eprosima::fastdds::dds::DataRepresentationQosPolicy* dataRepresentationQos_; + const eprosima::fastdds::dds::TypeConsistencyEnforcementQosPolicy* typeConsistencyQos_; public: class PartListener : public eprosima::fastdds::dds::DomainParticipantListener { -public: + public: PartListener( TestSubscriber* parent) @@ -154,11 +153,12 @@ class TestSubscriber TestSubscriber* parent_; std::atomic discovered_; - } part_listener_; + } + part_listener_; class SubListener : public eprosima::fastdds::dds::DataReaderListener { -public: + public: SubListener() { @@ -181,7 +181,8 @@ class TestSubscriber TestSubscriber* mParent; int n_matched; uint32_t n_samples; - } m_subListener; + } + m_subListener; }; #endif /* _TEST_SUBSCRIBER_H_ */ diff --git a/test/xtypes/XTypesTests.cpp b/test/xtypes/XTypesTests.cpp index b3b3c901454..eef8b80109d 100644 --- a/test/xtypes/XTypesTests.cpp +++ b/test/xtypes/XTypesTests.cpp @@ -12,26 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "idl/TypesPubSubTypes.h" -#include "idl/TypesTypeObject.h" - -#include - -#include "TestPublisher.h" -#include "TestSubscriber.h" - -#include -#include -#include -#include -#include -#include - -#include -#include #include -#include #include +#include +#include +#include #if defined(_WIN32) #define GET_PID _getpid @@ -42,6 +27,17 @@ #include #endif // if defined(_WIN32) +#include +#include +#include +#include +#include + +#include "idl/TypesPubSubTypes.h" +#include "idl/TypesTypeObject.h" +#include "TestPublisher.h" +#include "TestSubscriber.h" + using namespace eprosima::fastdds::dds; using namespace eprosima::fastrtps::rtps; @@ -66,7 +62,6 @@ class xtypestests : public ::testing::Test { //Log::Reset(); eprosima::fastdds::dds::Log::KillThread(); - eprosima::fastrtps::Domain::stopAll(); ++DOMAIN_ID_; DOMAIN_ID_ %= 230; } diff --git a/thirdparty/boost/include/boostconfig.hpp b/thirdparty/boost/include/boostconfig.hpp index 7cd06c68b1f..e2594b80eb3 100644 --- a/thirdparty/boost/include/boostconfig.hpp +++ b/thirdparty/boost/include/boostconfig.hpp @@ -42,7 +42,7 @@ #include // TODO(Adolfo): This will fail if windows system without program data in C: drive -#define BOOST_INTERPROCESS_SHARED_DIR_PATH "C:\\ProgramData\\eprosima\\fastrtps_interprocess" +#define BOOST_INTERPROCESS_SHARED_DIR_PATH "C:\\ProgramData\\eprosima\\fastdds_interprocess" // Check that generic emulation has not been accidentally enabled #include diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 065857df1b4..fe0c55218de 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(fastrtps_FOUND TRUE) +set(fastdds_FOUND TRUE) cmake_policy(PUSH) add_subdirectory(fds) diff --git a/tools/fastdds/fastdds.py b/tools/fastdds/fastdds.py index 15cdad83790..c5b632d765a 100755 --- a/tools/fastdds/fastdds.py +++ b/tools/fastdds/fastdds.py @@ -17,7 +17,7 @@ """ fastdds CLI tool. -This CLI tool provide a set commands and sub-commands to perform, Fast-DDS +This CLI tool provide a set commands and sub-commands to perform, Fast DDS related, maintenance / configuration tasks. usage: fastdds [] diff --git a/tools/fastdds/shm/clean.py b/tools/fastdds/shm/clean.py index d0196176dba..03dc71464fb 100644 --- a/tools/fastdds/shm/clean.py +++ b/tools/fastdds/shm/clean.py @@ -63,7 +63,7 @@ def __shm_dir(self): # Windows if os.name == 'nt': shm_path = Path('c:\\programdata\\eprosima\\' - 'fastrtps_interprocess\\').resolve() + 'fastdds_interprocess\\').resolve() elif os.name == 'posix': # MAC if platform.mac_ver()[0] != '': @@ -91,7 +91,7 @@ def __clean_zombie_segments(self): The deleted file names """ - segment_lock_re = re.compile('^fastrtps_(\\d|[a-z]){16}(_el|_sl)') + segment_lock_re = re.compile('^fastdds_(\\d|[a-z]){16}(_el|_sl)') # Each segment has an "_el" lock file that is locked if the segment # is open and the owner process is alive @@ -123,7 +123,7 @@ def __clean_zombie_ports(self): the deleted file names """ - port_lock_re = re.compile('^fastrtps_port\\d{,5}(_el|_sl)') + port_lock_re = re.compile('^fastdds_port\\d{,5}(_el|_sl)') # Each port has an "_el | _sl" lock file that is locked if the port # is open and the owner process is alive port_locks = [ diff --git a/tools/fastdds/shm/parser.py b/tools/fastdds/shm/parser.py index 64f8f9e171d..86e91fb2e69 100644 --- a/tools/fastdds/shm/parser.py +++ b/tools/fastdds/shm/parser.py @@ -15,7 +15,7 @@ """ fastdds shm sub-command. -This verb provides maintenance tasks related with Fast-DDS shared-memory +This verb provides maintenance tasks related with Fast DDS shared-memory transport. usage: fastdds shm [] diff --git a/tools/fastdds/xml_ci/parser.py b/tools/fastdds/xml_ci/parser.py index e638256439c..f295073e761 100644 --- a/tools/fastdds/xml_ci/parser.py +++ b/tools/fastdds/xml_ci/parser.py @@ -108,4 +108,4 @@ def xsd_dir(self): """ tool_path = Path(os.path.dirname(os.path.realpath(__file__))) # We assume the schema path is relative to our installation path - return tool_path / '../../../share/fastRTPS_profiles.xsd' + return tool_path / '../../../share/fastdds_profiles.xsd' diff --git a/tools/fds/CMakeLists.txt b/tools/fds/CMakeLists.txt index 6d523d7628a..8e6008952a8 100644 --- a/tools/fds/CMakeLists.txt +++ b/tools/fds/CMakeLists.txt @@ -20,8 +20,8 @@ project(fast-discovery-server VERSION 1.0.1 LANGUAGES CXX) # Load external dependencies ############################################################################### -if(NOT fastrtps_FOUND) - find_package(fastrtps 2.12 REQUIRED) +if(NOT fastdds_FOUND) + find_package(fastdds 3 REQUIRED) endif() ############################################################################### @@ -34,7 +34,7 @@ if (MSVC) if (CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) # add fast headers to enable class view on visual studio IDE - get_target_property(FAST_INCLUDE_DIR fastrtps INTERFACE_INCLUDE_DIRECTORIES) + get_target_property(FAST_INCLUDE_DIR fastdds INTERFACE_INCLUDE_DIRECTORIES) list(GET FAST_INCLUDE_DIR 0 FAST_INCLUDE_DIR) file(GLOB_RECURSE ALL_FAST_HEADERS @@ -43,7 +43,7 @@ if (MSVC) "${FAST_INCLUDE_DIR}/**/*.hxx" ) - source_group("Fast-RTPS Headers" FILES ${ALL_FAST_HEADERS}) + source_group("Fast DDS Headers" FILES ${ALL_FAST_HEADERS}) endif() @@ -62,7 +62,7 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE FAST_SERVER_VERSION=\"${PROJECT_VERSION}\" PRIVATE FAST_SERVER_BINARY=\"$\" ) -target_link_libraries(${PROJECT_NAME} fastrtps fastcdr fastdds::optionparser) +target_link_libraries(${PROJECT_NAME} fastdds fastcdr fastdds::optionparser) # Properties that change bin names depending on current config. # This is convenient because on installation all bins share folder @@ -76,8 +76,8 @@ set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX d-${PROJECT_VERSI ############################################################################### # If not isolated integrate -if(CMAKE_PROJECT_NAME STREQUAL "fastrtps" ) - set(BIN_INSTALL_DIR tools/fds/${BIN_INSTALL_DIR} CACHE PATH "Installation directory for binaries within Fast-DDS") +if(CMAKE_PROJECT_NAME STREQUAL "fastdds" ) + set(BIN_INSTALL_DIR tools/fds/${BIN_INSTALL_DIR} CACHE PATH "Installation directory for binaries within Fast DDS") else() set(BIN_INSTALL_DIR bin/ CACHE PATH "Installation directory for binaries") endif() @@ -102,7 +102,7 @@ install(EXPORT ${PROJECT_NAME}-targets ) # export xsd schema -install(FILES ../../resources/xsd/fastRTPS_profiles.xsd +install(FILES ../../resources/xsd/fastdds_profiles.xsd DESTINATION ${DATA_INSTALL_DIR} COMPONENT cmake ) diff --git a/tools/fds/server.cpp b/tools/fds/server.cpp index 29cc0f5e172..580b9ce1737 100644 --- a/tools/fds/server.cpp +++ b/tools/fds/server.cpp @@ -128,7 +128,7 @@ int fastdds_discovery_server( { // Set environment variables to prevent loading the default XML file #ifdef _WIN32 - if (0 != _putenv_s("FASTRTPS_DEFAULT_PROFILES_FILE", "") || + if (0 != _putenv_s("FASTDDS_DEFAULT_PROFILES_FILE", "") || 0 != _putenv_s("SKIP_DEFAULT_XML_FILE", "1")) { char errmsg[1024]; @@ -137,7 +137,7 @@ int fastdds_discovery_server( return 1; } #else - if (0 != unsetenv(fastrtps::xmlparser::DEFAULT_FASTRTPS_ENV_VARIABLE) || + if (0 != unsetenv(fastrtps::xmlparser::DEFAULT_FASTDDS_ENV_VARIABLE) || 0 != setenv(fastrtps::xmlparser::SKIP_DEFAULT_XML_FILE, "1", 1)) { std::cout << "Error setting environment variables: " << std::strerror(errno) << std::endl; diff --git a/utils/doxygen/complete_doxyfile_api b/utils/doxygen/complete_doxyfile_api deleted file mode 100644 index 4cd522704d8..00000000000 --- a/utils/doxygen/complete_doxyfile_api +++ /dev/null @@ -1,2355 +0,0 @@ -# Doxyfile 1.8.6 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = "Fast RTPS" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = $(VERSION_DOX) - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = "Fast RTPS Implementation" - -# With the PROJECT_LOGO tag one can specify an logo or icon that is included in -# the documentation. The maximum height of the logo should not exceed 55 pixels -# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo -# to the output directory. - -PROJECT_LOGO = ./doxygenfiles/eProsimaLogo.png - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = output/doxygen - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = YES - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = YES - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a -# new page for each member. If set to NO, the documentation of a member will be -# part of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make -# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C -# (default is Fortran), use: inc=Fortran f=C. -# -# Note For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by by putting a % sign in front of the word -# or globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = YES - -# If the EXTRACT_STATIC tag is set to YES all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = YES - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO these classes will be included in the various overviews. This option has -# no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO these declarations will be -# included in the documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = YES - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the -# todo list. This list is created by putting \todo commands in the -# documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the -# test list. This list is created by putting \test commands in the -# documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES the list -# will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = NO - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. Do not use file names with spaces, bibtex cannot handle them. See -# also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO doxygen will only warn about wrong or incomplete parameter -# documentation, but not about the absence of documentation. -# The default value is: NO. - -WARN_NO_PARAMDOC = YES - -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. -# The default value is: NO. - -WARN_AS_ERROR = YES - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. -# Note: If this tag is empty the current directory is searched. - -INPUT = ../../include/fastrtps \ - ../../thirdparty/eprosima-common-code/eProsima_cpp/log \ - doxygenfiles/mainpage.dox - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank the -# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, -# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, -# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, -# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, -# *.qsf, *.as and *.js. - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.markdown \ - *.md \ - *.mm \ - *.dox \ - *.py \ - *.f90 \ - *.f \ - *.for \ - *.vhd \ - *.vhdl - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = boost - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = ./utils/examples \ - ./examples/C++ - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = doxygenfiles - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER ) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES, then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = ./doxygenfiles/eprosima_header.html - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = ./doxygenfiles/eprosima_footer.html - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = ./doxygenfiles/customdoxygen.css - -# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- -# defined cascading style sheet that is included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefor more robust against future updates. -# Doxygen will copy the style sheet file to the output directory. For an example -# see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = ./doxygenfiles/general_architecture.png - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the stylesheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 208 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 221 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 100 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler ( hhc.exe). If non-empty -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated ( -# YES) or that it should be included in the master .chm file ( NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated ( -# YES) or a normal table of contents ( NO) in the .chm file. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = YES - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using prerendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /

    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 diff --git a/utils/doxygen/pages/mainpage.dox b/utils/doxygen/pages/mainpage.dox deleted file mode 100644 index 4c5fe77330a..00000000000 --- a/utils/doxygen/pages/mainpage.dox +++ /dev/null @@ -1,60 +0,0 @@ -/*! - * @mainpage eProsima Fast DDS library. - *

    - *

    Purpose

    - * Real-Time Publish-Subscribe (RTPS) is the wire interoperability protocol defined for the Data-Distribution Service (DDS) standard by - *the Object Management Group (OMG) consortium. This protocol standard is also defined by the OMG in the specification document - *“The Real-Time Publish-Subscribe Wire Protocol. DDS Interoperability Wire Protocol Specification (DDS-RTPS)” that can - *be obtained from the OMG web-page. The main objective of this specification is that all RTPSParticipants in a DDS communication - *structure, even if they use different vendor's implementations, can interoperate. - *

    - *

    Scope

    - * The scope of this implementation is going to be limited by the RTPS protocol specification of the OMG. Since the main purpose - *of this design is to facilitate the implementation of a standalone RTPS wire protocol as close to the specification as possible, - *the included features will be the ones described in the OMG document. The OMG specification defines message formats, interpretation - *and usage scenarios for any application willing to use RTPS protocol -* The most important features are: -*
      -*
    • Enable best-effort and reliable publish-subscribe communications for real-time applications.
    • -*
    • Plug and play connectivity so that any new applications are automatically discovered by the other members of the network.
    • -*
    • Modularity and scalability to allow continuous growth with both complex and simple devices in the network.
    • -*
    - * - *

    System architecture

    - * A general view of the system architecture can be found below: - * - * The Fast DDS library provides the user with two different layers to access its capabilities. The first is the RTPS layer, contained in the - * RTPSDomain. Using this layer, the user can directly create RTPSWriter and RTPSReader type objects and access their - * corresponding Histories. To facilitate the use of this layer an additional Publication-Subscription layer has - * been developed. This second layer allows the user to create Publishers and Subscribers associated to certain topics and - * transmit user-defined TopicDataTypes between them. - -

    Behavior Implementation

    -The correct behavior of the RTPS protocol will be achieved by using an event-based implementation. Multiple events will be handled by different threads allowing the application to efficiently tackle the different tasks. The thread structure, as well as the main events will be discussed in this section. -
    -

    Thread Structure

    -For each RTPSParticipant, various threads will be spawned to manage different aspects of the RTPS implementation. Each application using this implementation will at least have the following threads: -
    • Main thread: This will be the thread managed by the application or the user. The user will interact with the objects through the defined public APIs. -
    • Receive thread: These threads will be in charge of listening to the different ports. Since these threads will be blocked until a RTPS message is received there will be a different thread for each different IP-port combination that the RTPSParticipant is listening from. Multiple endpoints can be assigned to the same listening thread. -
    • Event thread(s): This thread will be in charge of processing events triggered by some periodic condition, or by actions performed by the user in the main thread. In this version a single event thread will be created and used per RTPSParticipant. -
    - -

    Resource Structure

    -There are three main types of resources in the implementation, that directly correspond with three classes. All resources are managed by the RTPSParticipant. -
    • ResourceListen: Each listen resource is assigned to a single IP:port combination. It receives and processes messages directed to that socket and performs the necessary actions in one or more of the associated Writers or Readers. In this version each ResourceListen runs a single thread listening to a single socket. Future versions may allow the association of multiple sockets (multiple ResourceListen objects) with a single listen thread. -
    • ResourceEvent: This resource manages the time-delayed event triggered periodically or by some message-based event. A single resource is implemented per RTPSParticipant, with a single thread performing all the actions. Future versions may include multiple ResourceEvents running in multiple threads to improve performance. -
    • Event thread(s): This resource manages ALL send operations in the RTPSParticipant. This means that all endpoints included in an RTPSParticipant send their messages through the socket defined in this resource. All messages are send synchronously. Future versions will include multiple ResourceSend objects and the possibility to asynchronously send messages. -
    - - -

    Main events

    -There are multiple events that are triggered wither directly by some action performed by the user, the reception of messages or even periodically. A list of the main events and the actions that need to be performed after them is included below, whereas a detailed description of all the events associated with each class of the design will be included in the detailed implementation chapter. -
    • User-triggered events: These events are triggered directly after the user performs some action, either directly to the RTPS Writer or its associated HistoryCache. -
    • Message-triggered events: These events are triggered by the reception of an RTPS message. For example, the reception of an ACKNACK message would trigger a change in the status of some CacheChanges in the HistoryCache and, maybe, the re-send of some packets to a specific Reader. -
    • Periodic events: Some events must be triggered periodically according to DDS rules. For example, heartbeat packets must be send each heartbeatPeriod to all matching Readers. -
    -
    -* - */ - - diff --git a/utils/futureCode/ReceivedChanges.cpp b/utils/futureCode/ReceivedChanges.cpp deleted file mode 100644 index 6618b6d91c8..00000000000 --- a/utils/futureCode/ReceivedChanges.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file ReceivedChanges.cpp - * - */ - -#include "ReceivedChanges.h" - -namespace eprosima { -namespace fastrtps { -namespace rtps { - -ReceivedChanges::ReceivedChanges() { - // TODO Auto-generated constructor stub -m_missingChanges.reserve(1000); -} - -ReceivedChanges::~ReceivedChanges() { - // TODO Auto-generated destructor stub -} - -bool ReceivedChanges::add(SequenceNumber_t& s) -{ - if(s > this->m_largestSequenceNumberReceived) - { - return insertMissingSequenceNumbers(s); - } - else if(s == this->m_largestSequenceNumberReceived) - { - return false; - } - else if(s < this->m_largestSequenceNumberReceived) - { - return missingSequenceNumberReceived(s); - } - return false; -} - -bool ReceivedChanges::insertMissingSequenceNumbers(SequenceNumber_t& s) -{ - int i = 1; - while(m_largestSequenceNumberReceived+i < s) - { - m_missingChanges.push_back(m_largestSequenceNumberReceived+i); - ++i; - } - m_largestSequenceNumberReceived = s; - return true; -} - -bool ReceivedChanges::missingSequenceNumberReceived(SequenceNumber_t& s) -{ - std::vector::iterator it = m_missingChanges.end(); - while(it > m_missingChanges.begin()) - { - --it; - if(*it == s) - { - m_missingChanges.erase(it); - return true; - } - if(*it< s) - return false; - } - return false; -} - -} -} /* namespace rtps */ -} /* namespace eprosima */ diff --git a/utils/futureCode/ReceivedChanges.h b/utils/futureCode/ReceivedChanges.h deleted file mode 100644 index 210f1b29e64..00000000000 --- a/utils/futureCode/ReceivedChanges.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file ReceivedChanges.h - * - */ - -#ifndef RECEIVEDCHANGES_H_ -#define RECEIVEDCHANGES_H_ - -#include "fastrtps/rtps/common/SequenceNumber.h" - -namespace eprosima { -namespace fastrtps { -namespace rtps{ - -class ReceivedChanges { -public: - ReceivedChanges(); - virtual ~ReceivedChanges(); - - bool add(SequenceNumber_t& s); -private: - bool insertMissingSequenceNumbers(SequenceNumber_t& s); - bool missingSequenceNumberReceived(SequenceNumber_t& s); - - std::vector m_missingChanges; - SequenceNumber_t m_largestSequenceNumberReceived; - -}; - -} -} /* namespace rtps */ -} /* namespace eprosima */ - -#endif /* RECEIVEDCHANGES_H_ */ diff --git a/utils/futureCode/SkipList.cpp b/utils/futureCode/SkipList.cpp deleted file mode 100644 index 1338a35ce2e..00000000000 --- a/utils/futureCode/SkipList.cpp +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file SkipList.cpp - * - */ - -#include "SkipList.h" - -#include -#include - -namespace eprosima { -namespace fastrtps{ -namespace rtps { - - -template -SkipNode::~SkipNode() -{ - delete [] mp_fwdNodes; -} - -template -SkipNode::SkipNode(Obj* obj,uint32_t level):m_height(level), -mp_data(obj) -{ - mp_fwdNodes = new SkipNode* [m_height]; - for(int x = 0;x -SkipNode::SkipNode(uint32_t level):m_height(level), -mp_data(nullptr) -{ - mp_fwdNodes = new SkipNode* [m_height]; - for(int x = 0;x -SkipList::SkipList(float probability,uint32_t maxHeight): m_maxHeight(maxHeight), -m_currHeight(0), -m_probability(probability), -mp_head(nullptr), -mp_tails(nullptr) -{ - srand (time(NULL)); - mp_head = new SkipNode(m_maxHeight); - mp_tails = new SkipNode* [m_maxHeight]; - for ( int x = 0; x < m_maxHeight; x++ ) - { - mp_head->mp_fwdNodes[x] = nullptr; - mp_tails[x] = mp_head; - } - -} - -template -SkipList::~SkipList() { - // Walk 0 level nodes and delete all - SkipNode* tmp; - SkipNode* nxt; - tmp = mp_head; - while ( tmp ) - { - nxt = tmp->mp_fwdNodes[0]; - delete tmp; - tmp = nxt; - } - delete [] mp_tails; -} - -template -bool SkipList::insert_at_end(Obj* obj) -{ - SkipNode* tmp = new SkipNode(obj,newLevel()); - for(int x = 0;xm_height;++x) - { - mp_tails[x]->mp_fwdNodes[x] = tmp; - mp_tails[x] = tmp; - } - return true; -} - -template -bool SkipList::insert(Obj* obj) -{ - int lvl = 0, h = 0; - SkipNode** updateVec = new SkipNode* [m_maxHeight]; - SkipNode* tmp = mp_head; - // Figure out where new node goes - for ( h = m_currHeight; h >= 0; h-- ) - { - while (tmp->mp_fwdNodes[h] != nullptr && *tmp->mp_fwdNodes[h]->mp_data < *obj ) - { - tmp = tmp->fwdNodes[h]; - } - updateVec[h] = tmp; - } - tmp = tmp->fwdNodes[0]; //Element just before the one we are inserting. - // If dup, return false - if ( *tmp->mp_data == *obj ) - { - return false; - } - else - { - // Perform an insert - lvl = newLevel(); - if ( lvl > m_currHeight ) - { - for ( int i = m_currHeight; i <= lvl; i++ ) - updateVec[i] = mp_head; - m_currHeight = lvl; - } - // Insert new element - tmp = new SkipNode(obj, lvl); - for ( int i = 0; i < lvl; i++ ) - { - tmp->fwdNodes[i] = updateVec[i]->fwdNodes[i]; - updateVec[i]->fwdNodes[i] = tmp; - } - } - return true; -} - - -template -bool SkipList::remove(Obj* obj) -{ - -} - - - -template -uint32_t SkipList::newLevel() -{ - uint32_t tmpLvl = 1; - // Develop a random number between 1 and maxLvl (node height). - while ((rand01() < m_probability) && - (tmpLvl < m_maxHeight)) - tmpLvl++; - - return tmpLvl; -} - -template -float SkipList::rand01() -{ - return static_cast (rand()) / static_cast (RAND_MAX); -} - -} -} /* namespace rtps */ -} /* namespace eprosima */ diff --git a/utils/futureCode/SkipList.h b/utils/futureCode/SkipList.h deleted file mode 100644 index a09b29b1343..00000000000 --- a/utils/futureCode/SkipList.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima). -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/** - * @file SkipList.h - * - */ - -#ifndef SKIPLIST_H_ -#define SKIPLIST_H_ - -namespace eprosima { -namespace fastrtps{ -namespace rtps { - -template -class SkipNode -{ -public: - SkipNode(Obj* obj,uint32_t level); - SkipNode(uint32_t level); - ~SkipNode(); - uint32_t m_height; - Obj* mp_data; - SkipNode** mp_fwdNodes; - -}; - - -template -class SkipList { -public: - SkipList(float probability, uint32_t maxHeight); - virtual ~SkipList(); - - bool insert_at_end(Obj* obj); - bool remove(Obj* obj); - bool insert(Obj* obj); - - -private: - uint32_t newLevel(); - float rand01(); - uint32_t m_maxHeight; - uint32_t m_currHeight; - float m_probability; - SkipNode* mp_head; - SkipNode** mp_tails; - -}; - -} -} /* namespace rtps */ -} /* namespace eprosima */ - -#endif /* SKIPLIST_H_ */ diff --git a/utils/images/icon/eprosima_icon.bmp b/utils/images/icon/eprosima_icon.bmp deleted file mode 100644 index 5f75476b6ba2003cb450174f46eb76f8294c5f42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9742 zcmeI$KW-aW5PLCbnj;V8o6pvA5NreHy zY*I|V{lnF+$%IS8yHde5ekQqIfFI_)B_;p-%eUW4d;Ivd$PYaG6+huC*|g`IzrOpX z!^!3!nj=Ik#CS9d3Dy#pX4Br$g3`ZT57y6UG-D zKVPG3$a;LqI`<>b3SC3i!+x07?bGpyCTEuK`mC(>KT#&3U;4%8Wi8*;--$aG@uuJM zXBUy#EWM7~?gOI9iog4=b9<{nf-D-`!dS|qtXEq{7HL?@=i{u?%ecb+YBtXhcDM~6w%rHCiJjG*T48^k2>Xx48&$5< zHJ#Y`td-W0L5!AiM%H>=FJW`CR_r>2&B|J{s|%Z#wQ5&vpC6mwh~^w?-H&rx#@AfC h#?v_e{5r4mGa6rUo!598=bvBab$&+UE8gzB{sqTm$Kn70 diff --git a/utils/images/icon/eprosima_icon.ico b/utils/images/icon/eprosima_icon.ico deleted file mode 100644 index 615e83a3a0552f645c936d07ce55f3832c11c3d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99678 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
    D$_^D7d}dFy6mq zIn3N?zv1EvAE~=k6EV2bPcCE;altnaIGaV z*qlk<-fkuE-nas)ZYWYtfxqt`vdrAxV+)=)$GeRP^?c|L5`%#E+giKaI5$)4H>(Xy zdV3Ve-s7+b*Nk|Z7hwMacfvZ8e>1nW@qK(H!Z6;yJ@)EUQs$1nQM~8_*zQ5syR_Z} z*74c}=!A^nrMFH2IE%p~Ev9?8V$BHKtOor}=X7lI)NcdF`}R2A8|?XSowK?Z`1IDk zDw*4RZbW@RA9F)&_w0Dz*6sGiUku~D?yRWLH?#NH$Ku|NGJkVG-gjJDXYybAwl*v8 zCb$}GI~B^&(ifh&^V4k?U{7$V`vK%Vj`#j1|E6zm9a#F34LK?U1z@Zerf%sTa>-v* zsx>3@(@Y4UX5M;h9yk@H*Gv z+?ug4-W%+Cm5PJqN9Nk8FKTA)?&>NHs}?T{t@S8LV)05ER^_EMq~?Q^s0J7E4h>%N zD0fqx@|R?QP?;%k_2`Ipw=XVn&y4MOBxnDpvG=523+`NUYgw6bHsGc|3gjLfY<~Nq zYlE!aom%DmX5aE|l6SouXMZ;M>gkWf21o`97${(%fPn%A3K%G0pn!n_6-WWFgI0!X zZE++Dg~j79N%43AaW9sTPwb1u9RK#R_~)h(P)IOJI<4ya3|v zN(uQ8w^xeCLEKg;E{3==0uWV3fF8oBga8y@3;`@&838O_8G(EnFG3)W#)}XT(|8dA zG%80xegLQ)M*+4h@-v43TNY7JAfILyAd2o-!#EljA{hIkxCqY`v&FcWKDWV;BEZIN zF&||CeGFOiFpqyQVEK#Roz zcCq*KRp7-zT)8|kMY%{u0kkdT;Y5bk9rAE8O=$ypIF4hT6bu2JkhV0B96tob(G!yp z6wM=lj-W7)JW4@f9(laH#UrH=hPxadfEFP-TyYRDMs0}O!gH>82IBUBE?0YuBe%HP zV;u9_D#1he_K;3x7DBAPyBOk_NlqR_i2?;!q>xaNr-j11#GME+nbL&TUo3)bavDKs zn{S(saasv6B7jtd3z2|-fUFp!G@ef@L!&fKX-$h~pCe={@bdSuWOrIT`y3Inr^T~z z%qlOQ4gZu#YJgj z0BsP^@@BpjdGr14^~UoCWs9@-wfCM|q3=KTp1O=Kufz diff --git a/utils/pcTests/Readme.md b/utils/pcTests/Readme.md deleted file mode 100644 index b920f23f575..00000000000 --- a/utils/pcTests/Readme.md +++ /dev/null @@ -1,3 +0,0 @@ -The files on this folder were removed on release 2.0.0. -You can find them on an eariler commit like 852db23cc121652c4f513c43bb2b9a5bb90b1ab6 or -on a previous release like [1.10.0](https://github.com/eProsima/Fast-RTPS/tree/1.10.x/utils/pcTests) \ No newline at end of file diff --git a/versions.md b/versions.md index 9725611018d..eea4008c163 100644 --- a/versions.md +++ b/versions.md @@ -1,6 +1,10 @@ Forthcoming ----------- +* Rename project to `fastdds`. +* Rename environment variable to `FASTDDS_DEFAULT_PROFILES_FILE` and rename default XML profiles file to `FASTDDS_DEFAULT_PROFILES`. +* Remove API marked as deprecated. + Version 2.14.0 -------------- @@ -31,7 +35,7 @@ Version 2.12.0 * Exposed custom payload pool on DDS endpoints declaration * Processing environment variables on XML text * Upgrade to support Fast CDR v2.0.0. - Default encoding is XCDRv1 to maintain interoperability with previous Fast-DDS versions. + Default encoding is XCDRv1 to maintain interoperability with previous Fast DDS versions. Some concerns: - Data type source code generated with Fast DDS-Gen v2 should be regenerated using Fast DDS-Gen v3. - **API break**. Changed a `MEMBER_INVALID` identifier from a `#define` to a `constexpr`.

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 a&$W`Kp^ExvE&0VB`v9@uW=mYGp#K9(rq7uG diff --git a/doc/pdf/Fast RTPS - User Manual.odt b/doc/pdf/Fast RTPS - User Manual.odt deleted file mode 100644 index 9f4a3ff045be56516dc7b159424c1cc10f5ad7e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281315 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