Use
The UUID data type is used to model any kind of Identification number (ID). IDs are often key members in a struct.
Description
UUID consists of two 64 bit integers called "upper" and "lower".
QDM
The QDM description of UUID is shown in the QDM snippet below:
(...)
<struct name="UUID">
<doc>A generic 128-bit UUID.</doc>
<member name="upper" type="int64">
<doc>Upper 64-bit of identifier.</doc>
</member>
<member name="lower" type="int64">
<doc>Lower 64-bit of identifier.</doc>
</member>
</struct>
(...)
Example of Use: Generating a UUID on Android
The code snippet below shows how to generate a random UUID for Qeo:
java.util.UUID jid = java.util.UUID.randomUUID(); org.qeo.UUID qid = new org.qeo.UUID(); qid.upper = jid.getMostSignificantBits(); qid.lower = jid.getLeastSignificantBits();
Example of Use: Generating a UUID on Unix/Linux in C
The code snippet below shows how to generate a random UUID for Qeo:
/*
* To get random character value of UUID string from Unix/Linux OS
* - input: UUID generator path e.g. /proc/sys/kernel/random/uuid
* - output: a pointer to allocated memory with the UUID string,
* an empty string if method is failed
* NOTE: memory has to be released later on
*/
char* get_uuid_string_from_sys(const char* path)
* get_uuid_string_from_sys(const char* path){
FILE* file = NULL;
char temp[128]; /* e9cabebc-923b-4932-a534-9578a6904bf8 */
char* result = NULL;
if (path == NULL){
/* error – invalid input argument */
return strdup("");
}
file = fopen(path, "rb");
if (file == NULL ) {
/* error – file is not opened */
return strdup("");
}
if (fgets(temp, sizeof(temp), file) == NULL){
fclose(file);
/* error - Could not get UUID */
return strdup("");
}
fclose(file);
result = strdup(temp);
if (result == NULL ) {
/* error - memory allocation call is failed */;
return strdup("");
}
return result;
}
/*
* To get qeo UUID structure from Unix/Linux OS based UUID string
* - input: UUID string, format is "e9cabebc-923b-4932-a534-9578a6904bf8"
* - output: qeo UUID structure
*/
org_qeo_UUID_t uuid_from_str(char* string)
{
char uuid_parsed[34];
char upperId[17];
char lowerId[17];
uint64_t upper = 0;
uint64_t lower = 0;
org_qeo_UUID_t qeoUUID;
if (string == NULL ) {
/* error - Invalid input argument */
qeoUUID.upper = upper;
qeoUUID.lower = lower;
return qeoUUID;
}
/* Remove all '-' characters */
char *src = string;
char *dst = uuid_parsed;
while ((*dst++ = *src++)) {
if (*src == '-') {
src++;
}
}
/* Split in 2 and convert from HEX to uint64_t */
snprintf(upperId, sizeof(upperId), "%s", uuid_parsed);
snprintf(lowerId, sizeof(lowerId), "%s", uuid_parsed + 16);
upper = strtoull(upperId, NULL, 16);
lower = strtoull(lowerId, NULL, 16);
qeoUUID.upper = upper;
qeoUUID.lower = lower;
return qeoUUID;
}
/*
* To get a random UUID qeo structure from Unix/Linux based system
* - input: a pointer to qeo structure to be filled in
* - output: 0 a qeo UUID
* -1 function is failed
*/
int get_uuid_from_sys(org_qeo_UUID_t * pUUID)
{
char* result_uuid = NULL;
if(!pUUID){
/* error - Invalid input argument ! */
return -1;
}
result_uuid = get_uuid_string_from_sys("/proc/sys/kernel/random/uuid");
if (!result_uuid) {
/* error - uuid_string_from_sys call is failed ! */
return -1;
} else if (strcmp(result_uuid,"") == 0){
free(result_uuid);
/* error - get_uuid_string_from_sys is failed ! */
return -1;
}
*pUUID = uuid_from_str(result_uuid);
free(result_uuid);
return 0;
}