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