Skip to content

Commit

Permalink
Add dds_get_guid to get the GUID of a local entity
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
eboasson committed Apr 9, 2020
1 parent b2cf692 commit 45c0f43
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 0 deletions.
20 changes: 20 additions & 0 deletions src/core/ddsc/include/dds/dds.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
31 changes: 31 additions & 0 deletions src/core/ddsc/src/dds_entity.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
22 changes: 22 additions & 0 deletions src/core/ddsc/tests/entity_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down

0 comments on commit 45c0f43

Please sign in to comment.