@@ -123,4 +123,228 @@ __rmw_get_subscriptions_info_by_topic(
123
123
allocator,
124
124
subscriptions_info);
125
125
}
126
+
127
+ rmw_ret_t
128
+ __rmw_get_clients_info_by_service (
129
+ const char * identifier,
130
+ const rmw_node_t * node,
131
+ rcutils_allocator_t * allocator,
132
+ const char * service_name,
133
+ bool no_mangle,
134
+ rmw_topic_endpoint_info_array_t * clients_info)
135
+ {
136
+ rmw_ret_t ret = __validate_arguments (
137
+ identifier,
138
+ node,
139
+ allocator,
140
+ service_name,
141
+ clients_info);
142
+ if (ret != RMW_RET_OK) {
143
+ return ret;
144
+ }
145
+ auto common_context = static_cast <rmw_dds_common::Context *>(node->context ->impl ->common );
146
+ std::string mangled_rq_topic_name, mangled_rp_topic_name;
147
+ mangled_rq_topic_name = mangled_rp_topic_name = service_name;
148
+ DemangleFunction demangle_type = _identity_demangle;
149
+ if (!no_mangle) {
150
+ mangled_rq_topic_name = \
151
+ _mangle_topic_name (ros_service_requester_prefix, service_name, " Request" ).to_string ();
152
+ mangled_rp_topic_name = \
153
+ _mangle_topic_name (ros_service_response_prefix, service_name, " Reply" ).to_string ();
154
+ demangle_type = _demangle_if_ros_type;
155
+ }
156
+ rmw_topic_endpoint_info_array_t publishers_info = \
157
+ rmw_get_zero_initialized_topic_endpoint_info_array ();
158
+ ret = common_context->graph_cache .get_writers_info_by_topic (
159
+ mangled_rq_topic_name,
160
+ demangle_type,
161
+ allocator,
162
+ &publishers_info);
163
+ std::unique_ptr<
164
+ rmw_topic_endpoint_info_array_t ,
165
+ std::function<void (rmw_topic_endpoint_info_array_t *)>>
166
+ publishers_info_delete_on_error (
167
+ &publishers_info,
168
+ [allocator](rmw_topic_endpoint_info_array_t * p) {
169
+ rmw_ret_t ret = rmw_topic_endpoint_info_array_fini (
170
+ p,
171
+ allocator
172
+ );
173
+ if (RMW_RET_OK != ret) {
174
+ RCUTILS_SAFE_FWRITE_TO_STDERR (" Failed to destroy publishers_info when function failed." );
175
+ }
176
+ }
177
+ );
178
+ if (RMW_RET_OK != ret) {
179
+ return ret;
180
+ }
181
+ rmw_topic_endpoint_info_array_t subscriptions_info = \
182
+ rmw_get_zero_initialized_topic_endpoint_info_array ();
183
+ ret = common_context->graph_cache .get_readers_info_by_topic (
184
+ mangled_rp_topic_name,
185
+ demangle_type,
186
+ allocator,
187
+ &subscriptions_info);
188
+ std::unique_ptr<
189
+ rmw_topic_endpoint_info_array_t ,
190
+ std::function<void (rmw_topic_endpoint_info_array_t *)>>
191
+ subscriptions_info_delete_on_error (
192
+ &subscriptions_info,
193
+ [allocator](rmw_topic_endpoint_info_array_t * p) {
194
+ rmw_ret_t ret = rmw_topic_endpoint_info_array_fini (
195
+ p,
196
+ allocator
197
+ );
198
+ if (RMW_RET_OK != ret) {
199
+ RCUTILS_SAFE_FWRITE_TO_STDERR (" Failed to destroy subscriptions_info when function failed." );
200
+ }
201
+ }
202
+ );
203
+ if (RMW_RET_OK != ret) {
204
+ return ret;
205
+ }
206
+
207
+ size_t total_size = publishers_info.size + subscriptions_info.size ;
208
+ ret = rmw_topic_endpoint_info_array_init_with_size (clients_info, total_size, allocator);
209
+ std::unique_ptr<
210
+ rmw_topic_endpoint_info_array_t ,
211
+ std::function<void (rmw_topic_endpoint_info_array_t *)>>
212
+ clients_info_delete_on_error (
213
+ clients_info,
214
+ [allocator](rmw_topic_endpoint_info_array_t * p) {
215
+ rmw_ret_t ret = rmw_topic_endpoint_info_array_fini (
216
+ p,
217
+ allocator
218
+ );
219
+ if (RMW_RET_OK != ret) {
220
+ RCUTILS_SAFE_FWRITE_TO_STDERR (" Failed to destroy clients_info when function failed." );
221
+ }
222
+ }
223
+ );
224
+ if (RMW_RET_OK != ret) {
225
+ return ret;
226
+ }
227
+ for (size_t i = 0 ; i < publishers_info.size ; ++i) {
228
+ clients_info->info_array [i] = publishers_info.info_array [i];
229
+ }
230
+ for (size_t i = 0 ; i < subscriptions_info.size ; ++i) {
231
+ clients_info->info_array [publishers_info.size + i] = subscriptions_info.info_array [i];
232
+ }
233
+ publishers_info_delete_on_error.release ();
234
+ subscriptions_info_delete_on_error.release ();
235
+ clients_info_delete_on_error.release ();
236
+ return RMW_RET_OK;
237
+ }
238
+
239
+ rmw_ret_t
240
+ __rmw_get_servers_info_by_service (
241
+ const char * identifier,
242
+ const rmw_node_t * node,
243
+ rcutils_allocator_t * allocator,
244
+ const char * service_name,
245
+ bool no_mangle,
246
+ rmw_topic_endpoint_info_array_t * servers_info)
247
+ {
248
+ rmw_ret_t ret = __validate_arguments (
249
+ identifier,
250
+ node,
251
+ allocator,
252
+ service_name,
253
+ servers_info);
254
+ if (ret != RMW_RET_OK) {
255
+ return ret;
256
+ }
257
+ auto common_context = static_cast <rmw_dds_common::Context *>(node->context ->impl ->common );
258
+ std::string mangled_rq_topic_name, mangled_rp_topic_name;
259
+ mangled_rq_topic_name = mangled_rp_topic_name = service_name;
260
+ DemangleFunction demangle_type = _identity_demangle;
261
+ if (!no_mangle) {
262
+ mangled_rq_topic_name = \
263
+ _mangle_topic_name (ros_service_requester_prefix, service_name, " Request" ).to_string ();
264
+ mangled_rp_topic_name = \
265
+ _mangle_topic_name (ros_service_response_prefix, service_name, " Reply" ).to_string ();
266
+ demangle_type = _demangle_if_ros_type;
267
+ }
268
+ rmw_topic_endpoint_info_array_t subscriptions_info = \
269
+ rmw_get_zero_initialized_topic_endpoint_info_array ();
270
+ ret = common_context->graph_cache .get_readers_info_by_topic (
271
+ mangled_rq_topic_name,
272
+ demangle_type,
273
+ allocator,
274
+ &subscriptions_info);
275
+ std::unique_ptr<
276
+ rmw_topic_endpoint_info_array_t ,
277
+ std::function<void (rmw_topic_endpoint_info_array_t *)>>
278
+ subscriptions_info_delete_on_error (
279
+ &subscriptions_info,
280
+ [allocator](rmw_topic_endpoint_info_array_t * p) {
281
+ rmw_ret_t ret = rmw_topic_endpoint_info_array_fini (
282
+ p,
283
+ allocator
284
+ );
285
+ if (RMW_RET_OK != ret) {
286
+ RCUTILS_SAFE_FWRITE_TO_STDERR (" Failed to destroy subscriptions_info when function failed." );
287
+ }
288
+ }
289
+ );
290
+ if (RMW_RET_OK != ret) {
291
+ return ret;
292
+ }
293
+ rmw_topic_endpoint_info_array_t publishers_info = \
294
+ rmw_get_zero_initialized_topic_endpoint_info_array ();
295
+ ret = common_context->graph_cache .get_writers_info_by_topic (
296
+ mangled_rp_topic_name,
297
+ demangle_type,
298
+ allocator,
299
+ &publishers_info);
300
+ std::unique_ptr<
301
+ rmw_topic_endpoint_info_array_t ,
302
+ std::function<void (rmw_topic_endpoint_info_array_t *)>>
303
+ publishers_info_delete_on_error (
304
+ &publishers_info,
305
+ [allocator](rmw_topic_endpoint_info_array_t * p) {
306
+ rmw_ret_t ret = rmw_topic_endpoint_info_array_fini (
307
+ p,
308
+ allocator
309
+ );
310
+ if (RMW_RET_OK != ret) {
311
+ RCUTILS_SAFE_FWRITE_TO_STDERR (" Failed to destroy publishers_info when function failed." );
312
+ }
313
+ }
314
+ );
315
+ if (RMW_RET_OK != ret) {
316
+ return ret;
317
+ }
318
+
319
+ size_t total_size = publishers_info.size + subscriptions_info.size ;
320
+ ret = rmw_topic_endpoint_info_array_init_with_size (servers_info, total_size, allocator);
321
+ std::unique_ptr<
322
+ rmw_topic_endpoint_info_array_t ,
323
+ std::function<void (rmw_topic_endpoint_info_array_t *)>>
324
+ servers_info_delete_on_error (
325
+ servers_info,
326
+ [allocator](rmw_topic_endpoint_info_array_t * p) {
327
+ rmw_ret_t ret = rmw_topic_endpoint_info_array_fini (
328
+ p,
329
+ allocator
330
+ );
331
+ if (RMW_RET_OK != ret) {
332
+ RCUTILS_SAFE_FWRITE_TO_STDERR (" Failed to destroy servers_info when function failed." );
333
+ }
334
+ }
335
+ );
336
+ if (RMW_RET_OK != ret) {
337
+ return ret;
338
+ }
339
+ for (size_t i = 0 ; i < publishers_info.size ; ++i) {
340
+ servers_info->info_array [i] = publishers_info.info_array [i];
341
+ }
342
+ for (size_t i = 0 ; i < subscriptions_info.size ; ++i) {
343
+ servers_info->info_array [publishers_info.size + i] = subscriptions_info.info_array [i];
344
+ }
345
+ publishers_info_delete_on_error.release ();
346
+ subscriptions_info_delete_on_error.release ();
347
+ servers_info_delete_on_error.release ();
348
+ return RMW_RET_OK;
349
+ }
126
350
} // namespace rmw_fastrtps_shared_cpp
0 commit comments