Add dds_get_guid to get the GUID of a local entity
This is merely a more convenient way of obtaining it: otherwise one has subscribe to the correct built-in topic, read the sample corresponding to the entity's instance handle and get the "key" field. That's a bit of a detour to get the network-wide unique identifier. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
b2cf6921da
commit
45c0f432a9
3 changed files with 73 additions and 0 deletions
|
@ -418,6 +418,26 @@ dds_get_mask(dds_entity_t condition, uint32_t *mask);
|
|||
DDS_EXPORT dds_return_t
|
||||
dds_get_instance_handle(dds_entity_t entity, dds_instance_handle_t *ihdl);
|
||||
|
||||
/**
|
||||
* @brief Returns the GUID that represents the entity in the network,
|
||||
* and therefore only supports participants, readers and writers.
|
||||
*
|
||||
* @param[in] entity Entity of which to get the instance handle.
|
||||
* @param[out] guid Where to store the GUID.
|
||||
*
|
||||
* @returns A dds_return_t indicating success or failure.
|
||||
*
|
||||
* @retval DDS_RETCODE_OK
|
||||
* Success.
|
||||
* @retval DDS_RETCODE_ILLEGAL_OPERATION
|
||||
* The operation is invoked on an inappropriate object.
|
||||
* @retval DDS_RETCODE_ERROR
|
||||
* An internal error has occurred.
|
||||
*/
|
||||
/* TODO: Check list of return codes is complete. */
|
||||
DDS_EXPORT dds_return_t
|
||||
dds_get_guid (dds_entity_t entity, dds_guid_t *guid);
|
||||
|
||||
/*
|
||||
All entities have a set of "status conditions" (following the DCPS
|
||||
spec), read peeks, take reads & resets (analogously to read & take
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "dds/ddsi/ddsi_pmd.h"
|
||||
#include "dds/ddsi/ddsi_xqos.h"
|
||||
#include "dds/ddsi/q_transmit.h"
|
||||
#include "dds/ddsi/q_bswap.h"
|
||||
|
||||
extern inline dds_entity *dds_entity_from_handle_link (struct dds_handle_link *hdllink);
|
||||
extern inline bool dds_entity_is_enabled (const dds_entity *e);
|
||||
|
@ -1285,6 +1286,36 @@ dds_return_t dds_get_instance_handle (dds_entity_t entity, dds_instance_handle_t
|
|||
return ret;
|
||||
}
|
||||
|
||||
dds_return_t dds_get_guid (dds_entity_t entity, dds_guid_t *guid)
|
||||
{
|
||||
dds_entity *e;
|
||||
dds_return_t ret;
|
||||
|
||||
if (guid == NULL)
|
||||
return DDS_RETCODE_BAD_PARAMETER;
|
||||
|
||||
if ((ret = dds_entity_pin (entity, &e)) != DDS_RETCODE_OK)
|
||||
return ret;
|
||||
switch (dds_entity_kind (e))
|
||||
{
|
||||
case DDS_KIND_PARTICIPANT:
|
||||
case DDS_KIND_READER:
|
||||
case DDS_KIND_WRITER: {
|
||||
DDSRT_STATIC_ASSERT (sizeof (dds_guid_t) == sizeof (ddsi_guid_t));
|
||||
ddsi_guid_t tmp = nn_ntoh_guid (e->m_guid);
|
||||
memcpy (guid, &tmp, sizeof (*guid));
|
||||
ret = DDS_RETCODE_OK;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
ret = DDS_RETCODE_ILLEGAL_OPERATION;
|
||||
break;
|
||||
}
|
||||
}
|
||||
dds_entity_unpin(e);
|
||||
return ret;
|
||||
}
|
||||
|
||||
dds_return_t dds_entity_pin (dds_entity_t hdl, dds_entity **eptr)
|
||||
{
|
||||
dds_return_t hres;
|
||||
|
|
|
@ -255,6 +255,28 @@ CU_Test(ddsc_entity, status, .init = create_entity, .fini = delete_entity)
|
|||
CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_OK);
|
||||
}
|
||||
|
||||
CU_Test(ddsc_entity, guid, .init = create_entity, .fini = delete_entity)
|
||||
{
|
||||
dds_return_t status;
|
||||
dds_guid_t guid, zero;
|
||||
memset(&zero, 0, sizeof(zero));
|
||||
|
||||
/* Don't check actual handle contents. That's a job
|
||||
* for the specific entity children, not for the generic part. */
|
||||
|
||||
/* Check getting Handle with bad parameters. */
|
||||
status = dds_get_guid (0, NULL);
|
||||
CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
|
||||
status = dds_get_guid (entity, NULL);
|
||||
CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
|
||||
status = dds_get_guid (0, &guid);
|
||||
CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
|
||||
|
||||
/* Get Instance Handle, which should not be 0 for a participant. */
|
||||
status = dds_get_guid (entity, &guid);
|
||||
CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
|
||||
CU_ASSERT_FATAL(memcmp(&guid, &zero, sizeof(guid)) != 0);
|
||||
}
|
||||
|
||||
CU_Test(ddsc_entity, instance_handle, .init = create_entity, .fini = delete_entity)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue