OpenDDS  Snapshot(2023/04/28-20:55)
Discovery.cpp
Go to the documentation of this file.
1 /*
2  * Distributed under the OpenDDS License.
3  * See: http://www.opendds.org/license.html
4  */
5 
6 #include <DCPS/DdsDcps_pch.h> // Only the _pch include should start with DCPS/
7 
8 #include "Discovery.h"
9 
10 #include "Service_Participant.h"
11 #include "BuiltInTopicUtils.h"
12 #include "Registered_Data_Types.h"
13 #include "Marked_Default_Qos.h"
14 #include "SafetyProfileStreams.h"
15 #include "DCPS_Utils.h"
16 
17 #include <dds/DdsDcpsCoreC.h>
18 #include <dds/OpenddsDcpsExtC.h>
19 #ifndef DDS_HAS_MINIMUM_BIT
20 # include <dds/DdsDcpsCoreTypeSupportImpl.h>
21 # include <dds/OpenddsDcpsExtTypeSupportImpl.h>
22 #endif
23 
25 
26 namespace OpenDDS {
27 namespace DCPS {
28 
30 {
31  ThreadStatusManager& thread_status_manager = TheServiceParticipant->get_thread_status_manager();
32  while (waiting) {
33  cond.wait(thread_status_manager);
34  }
35  return rc;
36 }
37 
39 {
40  ACE_GUARD(LockType, g, lock);
41  waiting = false;
42  rc = retcode;
43  cond.notify_all();
44 }
45 
46 const char* Discovery::DEFAULT_REPO = "DEFAULT_REPO";
47 const char* Discovery::DEFAULT_RTPS = "DEFAULT_RTPS";
48 const char* Discovery::DEFAULT_STATIC = "DEFAULT_STATIC";
49 
52 {
53 #ifndef DDS_HAS_MINIMUM_BIT
54 
55  TypeSupport_var type_support =
57 
58  if (CORBA::is_nil(type_support)) {
59  // Participant topic
60  DDS::ParticipantBuiltinTopicDataTypeSupport_var ts =
61  new DDS::ParticipantBuiltinTopicDataTypeSupportImpl;
62 
63  const DDS::ReturnCode_t ret = ts->register_type(participant,
65 
66  if (ret != DDS::RETCODE_OK) {
68  ACE_TEXT("(%P|%t) ")
69  ACE_TEXT("Discovery::create_bit_topics, ")
70  ACE_TEXT("register BUILT_IN_PARTICIPANT_TOPIC_TYPE returned %d.\n"),
71  ret),
72  ret);
73  }
74  }
75 
76  DDS::Topic_var bit_part_topic =
80  DDS::TopicListener::_nil(),
82 
83  if (CORBA::is_nil(bit_part_topic)) {
85  ACE_TEXT("(%P|%t) ")
86  ACE_TEXT("Discovery::create_bit_topics, ")
87  ACE_TEXT("Nil %C Topic\n"),
90  }
91 
92  // Participant location topic
93  type_support =
95 
96  if (CORBA::is_nil(type_support)) {
97  OpenDDS::DCPS::ParticipantLocationBuiltinTopicDataTypeSupport_var ts =
98  new OpenDDS::DCPS::ParticipantLocationBuiltinTopicDataTypeSupportImpl;
99 
100  const DDS::ReturnCode_t ret = ts->register_type(participant,
102 
103  if (ret != DDS::RETCODE_OK) {
105  ACE_TEXT("(%P|%t) ")
106  ACE_TEXT("Discovery::create_bit_topics, ")
107  ACE_TEXT("register BUILT_IN_PARTICIPANT_LOCATION_TOPIC_TYPE returned %C.\n"),
108  retcode_to_string(ret)),
109  ret);
110  }
111  }
112 
113  DDS::Topic_var bit_part_loc_topic =
117  DDS::TopicListener::_nil(),
119 
120  if (CORBA::is_nil(bit_part_loc_topic)) {
122  ACE_TEXT("(%P|%t) ")
123  ACE_TEXT("Discovery::create_bit_topics, ")
124  ACE_TEXT("Nil %C Topic\n"),
127  }
128 
129  // Internal thread status topic
130  type_support =
132 
133  if (CORBA::is_nil(type_support)) {
134  OpenDDS::DCPS::InternalThreadBuiltinTopicDataTypeSupport_var ts =
135  new OpenDDS::DCPS::InternalThreadBuiltinTopicDataTypeSupportImpl;
136 
137  const DDS::ReturnCode_t ret = ts->register_type(participant,
139 
140  if (ret != DDS::RETCODE_OK) {
142  ACE_TEXT("(%P|%t) ")
143  ACE_TEXT("Discovery::create_bit_topics, ")
144  ACE_TEXT("register BUILT_IN_INTERNAL_THREAD_TOPIC_TYPE returned %C.\n"),
145  retcode_to_string(ret)),
146  ret);
147  }
148  }
149 
150  DDS::Topic_var bit_internal_thread_topic =
154  DDS::TopicListener::_nil(),
156 
157  if (CORBA::is_nil(bit_internal_thread_topic)) {
159  ACE_TEXT("(%P|%t) ")
160  ACE_TEXT("Discovery::create_bit_topics, ")
161  ACE_TEXT("Nil %C Topic\n"),
164  }
165 
166  // Connection Record Topic
167  type_support =
169 
170  if (CORBA::is_nil(type_support)) {
171  OpenDDS::DCPS::ConnectionRecordTypeSupport_var ts =
172  new OpenDDS::DCPS::ConnectionRecordTypeSupportImpl;
173 
174  const DDS::ReturnCode_t ret = ts->register_type(participant,
176 
177  if (ret != DDS::RETCODE_OK) {
179  ACE_TEXT("(%P|%t) ")
180  ACE_TEXT("Discovery::create_bit_topics, ")
181  ACE_TEXT("register BUILT_IN_CONNECTION_RECORD_TOPIC_TYPE returned %C.\n"),
182  retcode_to_string(ret)),
183  ret);
184  }
185  }
186 
187  DDS::Topic_var bit_connection_record_topic =
191  DDS::TopicListener::_nil(),
193 
194  if (CORBA::is_nil(bit_connection_record_topic)) {
196  ACE_TEXT("(%P|%t) ")
197  ACE_TEXT("Discovery::create_bit_topics, ")
198  ACE_TEXT("Nil %C Topic\n"),
201  }
202 
203  // Topic topic
204  type_support =
205  Registered_Data_Types->lookup(participant, BUILT_IN_TOPIC_TOPIC_TYPE);
206 
207  if (CORBA::is_nil(type_support)) {
208  DDS::TopicBuiltinTopicDataTypeSupport_var ts =
209  new DDS::TopicBuiltinTopicDataTypeSupportImpl;
210 
211  const DDS::ReturnCode_t ret = ts->register_type(participant,
213 
214  if (ret != DDS::RETCODE_OK) {
216  ACE_TEXT("(%P|%t) ")
217  ACE_TEXT("Discovery::create_bit_topics, ")
218  ACE_TEXT("register BUILT_IN_TOPIC_TOPIC_TYPE returned %d.\n"),
219  ret),
220  ret);
221  }
222  }
223 
224  DDS::Topic_var bit_topic_topic =
225  participant->create_topic(BUILT_IN_TOPIC_TOPIC,
228  DDS::TopicListener::_nil(),
230 
231  if (CORBA::is_nil(bit_topic_topic)) {
233  ACE_TEXT("(%P|%t) ")
234  ACE_TEXT("Discovery::create_bit_topics, ")
235  ACE_TEXT("Nil %C Topic\n"),
238  }
239 
240  // Subscription topic
241  type_support =
243 
244  if (CORBA::is_nil(type_support)) {
245  DDS::SubscriptionBuiltinTopicDataTypeSupport_var ts =
246  new DDS::SubscriptionBuiltinTopicDataTypeSupportImpl;
247 
248  const DDS::ReturnCode_t ret = ts->register_type(participant,
250 
251  if (ret != DDS::RETCODE_OK) {
253  ACE_TEXT("(%P|%t) ")
254  ACE_TEXT("Discovery::create_bit_topics, ")
255  ACE_TEXT("register BUILT_IN_SUBSCRIPTION_TOPIC_TYPE returned %d.\n"),
256  ret),
257  ret);
258  }
259  }
260 
261  DDS::Topic_var bit_sub_topic =
265  DDS::TopicListener::_nil(),
267 
268  if (CORBA::is_nil(bit_sub_topic)) {
270  ACE_TEXT("(%P|%t) ")
271  ACE_TEXT("Discovery::create_bit_topics, ")
272  ACE_TEXT("Nil %C Topic\n"),
275  }
276 
277  // Publication topic
278  type_support =
280 
281  if (CORBA::is_nil(type_support)) {
282  DDS::PublicationBuiltinTopicDataTypeSupport_var ts =
283  new DDS::PublicationBuiltinTopicDataTypeSupportImpl;
284 
285  const DDS::ReturnCode_t ret = ts->register_type(participant,
287 
288  if (ret != DDS::RETCODE_OK) {
290  ACE_TEXT("(%P|%t) ")
291  ACE_TEXT("Discovery::create_bit_topics, ")
292  ACE_TEXT("register BUILT_IN_PUBLICATION_TOPIC_TYPE returned %d.\n"),
293  ret),
294  ret);
295  }
296  }
297 
298  DDS::Topic_var bit_pub_topic =
302  DDS::TopicListener::_nil(),
304 
305  if (CORBA::is_nil(bit_pub_topic)) {
307  ACE_TEXT("(%P|%t) ERROR: Discovery::create_bit_topics, ")
308  ACE_TEXT("Nil %C Topic\n"),
311  }
312 
313 
314  bit_part_topic->enable();
315  bit_topic_topic->enable();
316  bit_sub_topic->enable();
317  bit_pub_topic->enable();
318 
319  bit_part_loc_topic->enable();
320  bit_connection_record_topic->enable();
321  bit_internal_thread_topic->enable();
322 
323 #else
324  ACE_UNUSED_ARG(participant);
325 #endif /* DDS_HAS_MINIMUM_BIT */
326 
327  return DDS::RETCODE_OK;
328 }
329 
331 {
332 }
333 
335  const GUID_t&,
336  const GUID_t&,
337  const TransportLocatorSeq&)
338 {}
339 
341  const GUID_t&,
342  const GUID_t&,
343  const TransportLocatorSeq&)
344 {}
345 
346 } // namespace DCPS
347 } // namespace OpenDDS
348 
const char *const BUILT_IN_SUBSCRIPTION_TOPIC_TYPE
static const char * DEFAULT_RTPS
Definition: Discovery.h:86
Implements the OpenDDS::DCPS::DomainParticipant interfaces.
#define ACE_GUARD(MUTEX, OBJ, LOCK)
static const char * DEFAULT_REPO
Key value for the default repository IOR.
Definition: Discovery.h:85
const char *const BUILT_IN_CONNECTION_RECORD_TOPIC_TYPE
const char *const BUILT_IN_CONNECTION_RECORD_TOPIC
DDS::ReturnCode_t create_bit_topics(DomainParticipantImpl *participant)
Definition: Discovery.cpp:51
sequence< TransportLocator > TransportLocatorSeq
const DDS::StatusMask DEFAULT_STATUS_MASK
virtual DDS::Topic_ptr create_topic(const char *topic_name, const char *type_name, const DDS::TopicQos &qos, DDS::TopicListener_ptr a_listener, DDS::StatusMask mask)
const char *const BUILT_IN_PUBLICATION_TOPIC
DOMAINID_TYPE_NATIVE DomainId_t
#define Registered_Data_Types
DDS::ReturnCode_t wait()
Definition: Discovery.cpp:29
static const char * DEFAULT_STATIC
Definition: Discovery.h:87
virtual void update_publication_locators(DDS::DomainId_t domainId, const GUID_t &partId, const GUID_t &dwId, const TransportLocatorSeq &transInfo)
Definition: Discovery.cpp:334
const char *const BUILT_IN_PARTICIPANT_LOCATION_TOPIC_TYPE
ConditionVariable< LockType > cond
Definition: Discovery.h:52
DDS::ReturnCode_t rc
Definition: Discovery.h:54
const char *const BUILT_IN_PARTICIPANT_TOPIC
const char *const BUILT_IN_PARTICIPANT_LOCATION_TOPIC
bool notify_all()
Unblock all of the threads waiting on this condition.
ACE_TEXT("TCP_Factory")
const char *const BUILT_IN_PARTICIPANT_TOPIC_TYPE
const char *const BUILT_IN_SUBSCRIPTION_TOPIC
CvStatus wait(ThreadStatusManager &thread_status_manager)
Block until thread is woken up.
const char *const BUILT_IN_INTERNAL_THREAD_TOPIC
const char *const BUILT_IN_TOPIC_TOPIC
const char * retcode_to_string(DDS::ReturnCode_t value)
Definition: DCPS_Utils.cpp:29
const ReturnCode_t RETCODE_ERROR
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
const ReturnCode_t RETCODE_OK
#define ACE_ERROR_RETURN(X, Y)
const char *const BUILT_IN_INTERNAL_THREAD_TOPIC_TYPE
#define TheServiceParticipant
LM_ERROR
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
virtual void update_subscription_locators(DDS::DomainId_t domainId, const GUID_t &partId, const GUID_t &drId, const TransportLocatorSeq &transInfo)
Definition: Discovery.cpp:340
Boolean is_nil(T x)
const char *const BUILT_IN_TOPIC_TOPIC_TYPE
const char *const BUILT_IN_PUBLICATION_TOPIC_TYPE
#define TOPIC_QOS_DEFAULT
void done(DDS::ReturnCode_t retcode)
Definition: Discovery.cpp:38