//Verifying if the ID of the sender is an AMS service that this device trusts.
if(resPayload &&
- memcmp(context->amsMgrContext->amsDeviceId.id, resPayload->sid,
+ memcmp(context->amsMgrContext->amsDeviceId.id,
+ ((OCDiscoveryPayload*)clientResponse->payload)->sid,
+ // resPayload->sid,
sizeof(context->amsMgrContext->amsDeviceId.id)) != 0)
{
OC_LOG_V(ERROR, TAG, "%s Invalid AMS device", __func__);
typedef struct OCResourcePayload
{
char* uri;
- uint8_t* sid;
OCStringLL* types;
OCStringLL* interfaces;
uint8_t bitmap;
typedef struct
{
OCPayload base;
+
+ uint8_t* sid;
+
/** This structure holds the old /oic/res response. */
OCResourcePayload *resources;
/** This structure holds the collection response for the /oic/res. */
OC_LOG(level, PL_TAG, "\tNO Resources");
return;
}
-
+ OC_LOG(level, PL_TAG, "\tSID:");
+ OC_LOG_BUFFER(level, PL_TAG, payload->sid, UUID_SIZE);
OCResourcePayload* res = payload->resources;
while(res)
{
OC_LOG_V(level, PL_TAG, "\tResource #%d", i);
OC_LOG_V(level, PL_TAG, "\tURI:%s", res->uri);
- OC_LOG(level, PL_TAG, "\tSID:");
- OC_LOG_BUFFER(level, PL_TAG, res->sid, UUID_SIZE);
OC_LOG(level, PL_TAG, "\tResource Types:");
OCStringLL* strll = res->types;
while(strll)
void collectUniqueResource(const OCClientResponse * clientResponse)
{
- OCResourcePayload* res = ((OCDiscoveryPayload*)clientResponse->payload)->resources;
+ OCDiscoveryPayload* pay = (OCDiscoveryPayload*) clientResponse->payload;
+ OCResourcePayload* res = pay->resources;
// Including the NUL terminator, length of UUID string of the form:
// "a62389f7-afde-00b6-cd3e-12b97d2fcf09"
int ret = snprintf(sidStr, UUID_LENGTH,
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
- res->sid[0], res->sid[1], res->sid[2], res->sid[3],
- res->sid[4], res->sid[5], res->sid[6], res->sid[7],
- res->sid[8], res->sid[9], res->sid[10], res->sid[11],
- res->sid[12], res->sid[13], res->sid[14], res->sid[15]
+ pay->sid[0], pay->sid[1], pay->sid[2], pay->sid[3],
+ pay->sid[4], pay->sid[5], pay->sid[6], pay->sid[7],
+ pay->sid[8], pay->sid[9], pay->sid[10], pay->sid[11],
+ pay->sid[12], pay->sid[13], pay->sid[14], pay->sid[15]
);
if (ret == UUID_LENGTH - 1)
}
pl->uri = OICStrdup(res->uri);
- pl->sid = (uint8_t*)OICCalloc(1, UUID_SIZE);
- if(!pl->uri || ! pl->sid)
+
+ if(!pl->uri)
{
FreeOCDiscoveryResource(pl);
return NULL;
}
- memcpy(pl->sid, OCGetServerInstanceID(), UUID_SIZE);
// types
OCResourceType* typePtr = res->rsrcType;
}
OICFree(payload->uri);
- OICFree(payload->sid);
OCFreeOCStringLL(payload->types);
OCFreeOCStringLL(payload->interfaces);
FreeOCDiscoveryResource(payload->next);
{
return;
}
-
+ OICFree(payload->sid);
FreeOCDiscoveryResource(payload->resources);
OICFree(payload);
}
}
else if (payload->resources)
{
+ /*
+ The format for the payload is "modelled" as JSON.
+
+ [ // rootArray
+ { // rootMap
+ "di" : UUID, // device ID
+ links :[ // linksArray contains maps of resources
+ {
+ href, rt, if, policy // Resource 1
+ },
+ {
+ href, rt, if, policy // Resource 2
+ },
+ .
+ .
+ .
+ ]
+ }
+ ]
+ */
+ CborEncoder rootMap = {};
size_t resourceCount = OCDiscoveryPayloadGetResourceCount(payload);
- err = err | cbor_encoder_create_array(&encoder, &rootArray, resourceCount);
+
+ // Open the main root array
+ err = err | cbor_encoder_create_array(&encoder, &rootArray, 1);
+
+ // Open the root map in the root array
+ err = err | cbor_encoder_create_map(&rootArray, &rootMap, DISCOVERY_CBOR_RES_MAP_LEN);
+
+ // Insert Device ID into the root map
+ err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_DEVICE_ID,
+ sizeof(OC_RSRVD_DEVICE_ID) - 1);
+ err = err | cbor_encode_byte_string(&rootMap, payload->sid, UUID_SIZE);
+
+
+ // Insert Links into the root map.
+ CborEncoder linkArray = {};
+ err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_LINKS,
+ sizeof(OC_RSRVD_LINKS) - 1);
+ err = err | cbor_encoder_create_array(&rootMap, &linkArray, resourceCount);
for(size_t i = 0; i < resourceCount; ++i)
{
- CborEncoder map;
+ CborEncoder resourceMapElement = {};
OCResourcePayload* resource = OCDiscoveryPayloadGetResource(payload, i);
if(!resource)
{
return OC_STACK_INVALID_PARAM;
}
- err = err | cbor_encoder_create_map(&rootArray, &map, DISCOVERY_CBOR_RES_MAP_LEN);
+ // resource map inside the links array.
+ err = err | cbor_encoder_create_map(&linkArray, &resourceMapElement,
+ DISCOVERY_CBOR_LINKS_MAP_LEN);
+
+ // Below are insertions of the resource properties into the map.
+ // Uri
+ err = err | AddTextStringToMap(&resourceMapElement, OC_RSRVD_HREF,
+ sizeof(OC_RSRVD_HREF) - 1,
+ resource->uri);
+ // Resource Type
+ if (resource->types)
+ {
+ char* joinedTypes = OCStringLLJoin(resource->types);
+ if (joinedTypes)
+ {
+ err = err | cbor_encode_text_string(&resourceMapElement, OC_RSRVD_RESOURCE_TYPE,
+ sizeof(OC_RSRVD_RESOURCE_TYPE) - 1);
+ err = err | cbor_encode_text_string(&resourceMapElement, joinedTypes,
+ strlen(joinedTypes));
+ OICFree(joinedTypes);
+ }
+ else
+ {
+ return OC_STACK_NO_MEMORY;
+ }
+ }
+ // Interface Types
+ if (resource->interfaces)
+ {
+ char* joinedInterfaces = OCStringLLJoin(resource->interfaces);
+ if (joinedInterfaces)
+ {
+ err = err | cbor_encode_text_string(&resourceMapElement, OC_RSRVD_INTERFACE,
+ sizeof(OC_RSRVD_INTERFACE) - 1);
+ err = err | cbor_encode_text_string(&resourceMapElement, joinedInterfaces,
+ strlen(joinedInterfaces));
+ OICFree(joinedInterfaces);
+ }
+ else
+ {
+ return OC_STACK_NO_MEMORY;
+ }
+ }
+
+ // Policy
+ CborEncoder policyMap;
+ err = err | cbor_encode_text_string(&resourceMapElement, OC_RSRVD_POLICY,
+ sizeof(OC_RSRVD_POLICY) - 1);
+ err = err | cbor_encoder_create_map(&resourceMapElement, &policyMap, CborIndefiniteLength);
- // Device ID
- err = err | cbor_encode_text_string(&map, OC_RSRVD_DEVICE_ID,
- sizeof(OC_RSRVD_DEVICE_ID) - 1);
- err = err | cbor_encode_byte_string(&map, resource->sid, UUID_SIZE);
+ // Bitmap
+ err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_BITMAP,
+ sizeof(OC_RSRVD_BITMAP) - 1);
+ err = err | cbor_encode_uint(&policyMap, resource->bitmap);
+ if(resource->secure)
{
- CborEncoder linkArray;
- err = err | cbor_encode_text_string(&map, OC_RSRVD_LINKS, sizeof(OC_RSRVD_LINKS) -1);
- err = err | cbor_encoder_create_array(&map, &linkArray, CborIndefiniteLength);
+ err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_SECURE,
+ sizeof(OC_RSRVD_SECURE) - 1);
+ err = err | cbor_encode_boolean(&policyMap, OC_RESOURCE_SECURE);
- // Link Map
+ if(resource->port != 0)
{
- CborEncoder linkMap;
- err = err | cbor_encoder_create_map(&linkArray, &linkMap, DISCOVERY_CBOR_LINKS_MAP_LEN);
-
- // Uri
- err = err | AddTextStringToMap(&linkMap, OC_RSRVD_HREF,
- sizeof(OC_RSRVD_HREF) - 1,
- resource->uri);
- // Resource Type
- if (resource->types)
- {
- char* joinedTypes = OCStringLLJoin(resource->types);
- if (joinedTypes)
- {
- err = err | cbor_encode_text_string(&linkMap, OC_RSRVD_RESOURCE_TYPE,
- sizeof(OC_RSRVD_RESOURCE_TYPE) - 1);
- err = err | cbor_encode_text_string(&linkMap, joinedTypes,
- strlen(joinedTypes));
- OICFree(joinedTypes);
- }
- else
- {
- return OC_STACK_NO_MEMORY;
- }
- }
- // Interface Types
- if (resource->interfaces)
- {
- char* joinedInterfaces = OCStringLLJoin(resource->interfaces);
- if (joinedInterfaces)
- {
- err = err | cbor_encode_text_string(&linkMap, OC_RSRVD_INTERFACE,
- sizeof(OC_RSRVD_INTERFACE) - 1);
- err = err | cbor_encode_text_string(&linkMap, joinedInterfaces,
- strlen(joinedInterfaces));
- OICFree(joinedInterfaces);
- }
- else
- {
- return OC_STACK_NO_MEMORY;
- }
- }
- // Policy
- {
- CborEncoder policyMap;
- err = err | cbor_encode_text_string(&linkMap, OC_RSRVD_POLICY,
- sizeof(OC_RSRVD_POLICY) - 1);
- err = err | cbor_encoder_create_map(&linkMap, &policyMap, CborIndefiniteLength);
-
- // Bitmap
- err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_BITMAP,
- sizeof(OC_RSRVD_BITMAP) - 1);
- err = err | cbor_encode_uint(&policyMap, resource->bitmap);
-
- if(resource->secure)
- {
- err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_SECURE,
- sizeof(OC_RSRVD_SECURE) - 1);
- err = err | cbor_encode_boolean(&policyMap, OC_RESOURCE_SECURE);
-
- if(resource->port != 0)
- {
- err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_HOSTING_PORT,
- sizeof(OC_RSRVD_HOSTING_PORT) - 1);
- err = err | cbor_encode_uint(&policyMap, resource->port);
- }
- }
-
- err = err | cbor_encoder_close_container(&linkMap, &policyMap);
- }
- // Close
- err = err | cbor_encoder_close_container(&linkArray, &linkMap);
+ err = err | cbor_encode_text_string(&policyMap, OC_RSRVD_HOSTING_PORT,
+ sizeof(OC_RSRVD_HOSTING_PORT) - 1);
+ err = err | cbor_encode_uint(&policyMap, resource->port);
}
- err = err | cbor_encoder_close_container(&map, &linkArray);
}
- err = err | cbor_encoder_close_container(&rootArray, &map);
+
+ err = err | cbor_encoder_close_container(&resourceMapElement, &policyMap);
+
+ // Finsihed encoding a resource, close the map.
+ err = err | cbor_encoder_close_container(&linkArray, &resourceMapElement);
}
- // Close main array
+ // Close links array inside the root map.
+ err = err | cbor_encoder_close_container(&rootMap, &linkArray);
+ // close root map inside the root array.
+ err = err | cbor_encoder_close_container(&rootArray, &rootMap);
+ // Close the final root array.
err = err | cbor_encoder_close_container(&encoder, &rootArray);
}
bool err = false;
OCResourcePayload* resource = NULL;
+ uint16_t resourceCount = 0;
+ CborValue resourceMap = {};
OCDiscoveryPayload* out = OCDiscoveryPayloadCreate();
if(!out)
return OC_STACK_NO_MEMORY;
}
- CborValue arrayVal;
- err = err || cbor_value_enter_container(rootValue, &arrayVal);
+ // Root value is already inside the main root array
+ CborValue rootMap = {};
- if (cbor_value_is_array(&arrayVal))
+ // Enter the main root map
+ err = err || cbor_value_enter_container(rootValue, &rootMap);
+ // Look for DI
+ CborValue curVal = {};
+ err = cbor_value_map_find_value(&rootMap, OC_RSRVD_DEVICE_ID, &curVal);
+ if (CborNoError != err)
{
- OCLinksPayload *linksPayload = NULL;
- OCTagsPayload *tagsPayload = NULL;
- while (cbor_value_is_container(&arrayVal))
- {
- linksPayload = NULL;
- tagsPayload = NULL;
- CborValue colResources;
- CborError cborFindResult = cbor_value_enter_container(&arrayVal, &colResources);
- if (CborNoError != cborFindResult)
- {
- goto cbor_error;
- }
+ OC_LOG(ERROR, TAG, "Cbor find value failed.");
+ goto malformed_cbor;
+ }
+ size_t len;
+ err = cbor_value_dup_byte_string(&curVal, &(out->sid), &len, NULL);
- if (OC_STACK_OK != OCTagsCborToPayload(&colResources, &tagsPayload))
- {
- OC_LOG(ERROR, TAG, "Tags cbor parsing failed.");
- OCFreeTagsResource(tagsPayload);
- goto cbor_error;
- }
+ // Look for Links which will have an array as the value
+ err = cbor_value_map_find_value(&rootMap, OC_RSRVD_LINKS, &curVal);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor find value failed.");
+ goto malformed_cbor;
+ }
- if (OC_STACK_OK != OCLinksCborToPayload(&colResources, &linksPayload))
- {
- OC_LOG(ERROR, TAG, "Links cbor parsing failed.");
- OCFreeTagsResource(tagsPayload);
- OCFreeLinksResource(linksPayload);
- goto cbor_error;
- }
+ // Enter the links array and start iterating through the array processing
+ // each resource which shows up as a map.
+ err = err || cbor_value_enter_container(&curVal, &resourceMap);
- if (OC_STACK_OK != OCDiscoveryCollectionPayloadAddResource(out, tagsPayload, linksPayload))
- {
- OC_LOG(ERROR, TAG, "Memory allocation failed");
- OCFreeLinksResource(linksPayload);
- OCFreeTagsResource(tagsPayload);
- OCDiscoveryPayloadDestroy(out);
- return OC_STACK_NO_MEMORY;
- }
- if (CborNoError != cbor_value_advance(&arrayVal))
- {
- OC_LOG(ERROR, TAG, "Cbor value advanced failed.");
- goto cbor_error;
- }
- }
- }
- if (cbor_value_is_map(&arrayVal))
+ while (cbor_value_is_map(&resourceMap))
{
- size_t resourceCount = 0;
- while (cbor_value_is_map(&arrayVal))
+ resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
+ if(!resource)
{
- resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
- if(!resource)
- {
- OC_LOG(ERROR, TAG, "Memory allocation failed");
- OCDiscoveryPayloadDestroy(out);
- return OC_STACK_NO_MEMORY;
- }
- CborValue curVal;
- // DI
- err = cbor_value_map_find_value(&arrayVal, OC_RSRVD_DEVICE_ID, &curVal);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor find value failed.");
- goto malformed_cbor;
- }
- size_t len;
- err = cbor_value_dup_byte_string(&curVal, &(resource->sid), &len, NULL);
+ OC_LOG(ERROR, TAG, "Memory allocation failed");
+ OCDiscoveryPayloadDestroy(out);
+ return OC_STACK_NO_MEMORY;
+ }
+
+ // Uri
+ CborValue uriVal = {};
+ err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_HREF, &uriVal);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor finding href type failed.");
+ goto malformed_cbor;
+ }
+ err = cbor_value_dup_text_string(&uriVal, &(resource->uri), &len, NULL);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor finding href value failed.");
+ goto malformed_cbor;
+ }
+ // ResourceTypes
+ CborValue rtVal = {};
+ err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_RESOURCE_TYPE, &rtVal);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor finding rt type failed.");
+ goto malformed_cbor;
+ }
+ if (cbor_value_is_text_string(&rtVal))
+ {
+ char* input = NULL;
+ char* savePtr;
+ err = cbor_value_dup_text_string(&rtVal, &input, &len, NULL);
if (CborNoError != err)
{
- OC_LOG(ERROR, TAG, "Cbor di finding failed.");
+ OC_LOG(ERROR, TAG, "Cbor finding rt value failed.");
goto malformed_cbor;
}
- // Links TAG
+ if (input)
{
- CborValue linkArray;
- err = cbor_value_map_find_value(&arrayVal, OC_RSRVD_LINKS, &linkArray);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor links finding failed.");
- goto malformed_cbor;
- }
- CborValue linkMap;
- err = cbor_value_enter_container(&linkArray, &linkMap);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor entering map failed.");
- goto malformed_cbor;
- }
- // Uri
- err = cbor_value_map_find_value(&linkMap, OC_RSRVD_HREF, &curVal);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor finding href type failed.");
- goto malformed_cbor;
- }
- err = cbor_value_dup_text_string(&curVal, &(resource->uri), &len, NULL);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor finding href value failed.");
- goto malformed_cbor;
- }
- // ResourceTypes
- CborValue rtVal;
- err = cbor_value_map_find_value(&linkMap, OC_RSRVD_RESOURCE_TYPE, &rtVal);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor finding rt type failed.");
- goto malformed_cbor;
- }
- if (cbor_value_is_text_string(&rtVal))
+ char* curPtr = strtok_r(input, " ", &savePtr);
+
+ while (curPtr)
{
- char* input = NULL;
- char* savePtr;
- err = cbor_value_dup_text_string(&rtVal, &input, &len, NULL);
- if (CborNoError != err)
+ char* trimmed = InPlaceStringTrim(curPtr);
+ if (trimmed[0] !='\0')
{
- OC_LOG(ERROR, TAG, "Cbor finding rt value failed.");
- goto malformed_cbor;
- }
- if (input)
- {
- char* curPtr = strtok_r(input, " ", &savePtr);
-
- while (curPtr)
+ if (!OCResourcePayloadAddResourceType(resource, trimmed))
{
- char* trimmed = InPlaceStringTrim(curPtr);
- if (trimmed[0] !='\0')
- {
- if (!OCResourcePayloadAddResourceType(resource, trimmed))
- {
- OICFree(resource->uri);
- OICFree(resource->sid);
- OCFreeOCStringLL(resource->types);
- OICFree(resource);
- OCDiscoveryPayloadDestroy(out);
- return OC_STACK_NO_MEMORY;
- }
- }
- curPtr = strtok_r(NULL, " ", &savePtr);
+ OICFree(resource->uri);
+ OCFreeOCStringLL(resource->types);
+ OICFree(resource);
+ OCDiscoveryPayloadDestroy(out);
+ return OC_STACK_NO_MEMORY;
}
- OICFree(input);
}
+ curPtr = strtok_r(NULL, " ", &savePtr);
}
+ OICFree(input);
+ }
+ }
- // Interface Types
- CborValue ifVal;
- err = cbor_value_map_find_value(&linkMap, OC_RSRVD_INTERFACE, &ifVal);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor finding if type failed.");
- goto malformed_cbor;
- }
- if (!err && cbor_value_is_text_string(&ifVal))
- {
- char* input = NULL;
- char* savePtr;
- err = cbor_value_dup_text_string(&ifVal, &input, &len, NULL);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor finding if value failed.");
- goto malformed_cbor;
- }
- if (input)
- {
- char* curPtr = strtok_r(input, " ", &savePtr);
+ // Interface Types
+ CborValue ifVal = {};
+ err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_INTERFACE, &ifVal);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor finding if type failed.");
+ goto malformed_cbor;
+ }
+ if (!err && cbor_value_is_text_string(&ifVal))
+ {
+ char* input = NULL;
+ char* savePtr;
+ err = cbor_value_dup_text_string(&ifVal, &input, &len, NULL);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor finding if value failed.");
+ goto malformed_cbor;
+ }
+ if (input)
+ {
+ char* curPtr = strtok_r(input, " ", &savePtr);
- while (curPtr)
- {
- char* trimmed = InPlaceStringTrim(curPtr);
- if (trimmed[0] !='\0')
- {
- if (!OCResourcePayloadAddInterface(resource, trimmed))
- {
- OICFree(resource->uri);
- OICFree(resource->sid);
- OCFreeOCStringLL(resource->types);
- OICFree(resource);
- OCDiscoveryPayloadDestroy(out);
- return OC_STACK_NO_MEMORY;
- }
- }
- curPtr = strtok_r(NULL, " ", &savePtr);
- }
- OICFree(input);
- }
- }
- // Policy
+ while (curPtr)
{
- CborValue policyMap;
- err = cbor_value_map_find_value(&linkMap, OC_RSRVD_POLICY, &policyMap);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor finding policy type failed.");
- goto malformed_cbor;
- }
- // Bitmap
- CborValue val;
- err = cbor_value_map_find_value(&policyMap, OC_RSRVD_BITMAP, &val);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor finding bitmap type failed.");
- goto malformed_cbor;
- }
- uint64_t temp = 0;
- err = cbor_value_get_uint64(&val, &temp);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor finding bitmap value failed.");
- goto malformed_cbor;
- }
- resource->bitmap = (uint8_t)temp;
- // Secure Flag
- err = cbor_value_map_find_value(&policyMap, OC_RSRVD_SECURE, &val);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor finding secure type failed.");
- goto malformed_cbor;
- }
- if(cbor_value_is_valid(&val))
+ char* trimmed = InPlaceStringTrim(curPtr);
+ if (trimmed[0] !='\0')
{
- err = cbor_value_get_boolean(&val, &(resource->secure));
- if (CborNoError != err)
+ if (!OCResourcePayloadAddInterface(resource, trimmed))
{
- OC_LOG(ERROR, TAG, "Cbor finding secure value failed.");
- goto malformed_cbor;
- }
- // Port
- CborValue port;
- err = cbor_value_map_find_value(&policyMap, OC_RSRVD_HOSTING_PORT,
- &port);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor finding port type failed.");
- goto malformed_cbor;
- }
- if(cbor_value_is_valid(&port))
- {
- err = cbor_value_get_uint64(&port, &temp);
- if (CborNoError != err)
- {
- OC_LOG(ERROR, TAG, "Cbor finding port value failed.");
- goto malformed_cbor;
- }
- resource->port = (uint16_t)temp;
+ OICFree(resource->uri);
+ OCFreeOCStringLL(resource->types);
+ OICFree(resource);
+ OCDiscoveryPayloadDestroy(out);
+ return OC_STACK_NO_MEMORY;
}
}
+ curPtr = strtok_r(NULL, " ", &savePtr);
}
+ OICFree(input);
}
- err = cbor_value_advance(&arrayVal);
+ }
+
+ // Policy
+ CborValue policyMap = {};
+ err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_POLICY, &policyMap);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor finding policy type failed.");
+ goto malformed_cbor;
+ }
+ // Bitmap
+ CborValue val = {};
+ err = cbor_value_map_find_value(&policyMap, OC_RSRVD_BITMAP, &val);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor finding bitmap type failed.");
+ goto malformed_cbor;
+ }
+ uint64_t temp = 0;
+ err = cbor_value_get_uint64(&val, &temp);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor finding bitmap value failed.");
+ goto malformed_cbor;
+ }
+ resource->bitmap = (uint8_t)temp;
+ // Secure Flag
+ err = cbor_value_map_find_value(&policyMap, OC_RSRVD_SECURE, &val);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor finding secure type failed.");
+ goto malformed_cbor;
+ }
+ if(cbor_value_is_valid(&val))
+ {
+ err = cbor_value_get_boolean(&val, &(resource->secure));
if (CborNoError != err)
{
- OC_LOG(ERROR, TAG, "Cbor advance value failed.");
+ OC_LOG(ERROR, TAG, "Cbor finding secure value failed.");
goto malformed_cbor;
}
- ++resourceCount;
- OCDiscoveryPayloadAddNewResource(out, resource);
+ // Port
+ CborValue port;
+ err = cbor_value_map_find_value(&policyMap, OC_RSRVD_HOSTING_PORT,
+ &port);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor finding port type failed.");
+ goto malformed_cbor;
+ }
+ if(cbor_value_is_valid(&port))
+ {
+ err = cbor_value_get_uint64(&port, &temp);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor finding port value failed.");
+ goto malformed_cbor;
+ }
+ resource->port = (uint16_t)temp;
+ }
}
+
+ err = cbor_value_advance(&resourceMap);
+ if (CborNoError != err)
+ {
+ OC_LOG(ERROR, TAG, "Cbor advance value failed.");
+ goto malformed_cbor;
+ }
+ ++resourceCount;
+ OCDiscoveryPayloadAddNewResource(out, resource);
}
- err = err || cbor_value_leave_container(rootValue, &arrayVal);
+
+ err = err || cbor_value_leave_container(rootValue, &resourceMap);
*outPayload = (OCPayload*)out;
return OC_STACK_OK;
malformed_cbor:
OICFree(resource->uri);
- OICFree(resource->sid);
OCFreeOCStringLL(resource->types);
OCFreeOCStringLL(resource->interfaces);
OICFree(resource);
if(payload)
{
+ ((OCDiscoveryPayload*)payload)->sid = (uint8_t*)OICCalloc(1, UUID_SIZE);
+ memcpy(((OCDiscoveryPayload*)payload)->sid,
+ OCGetServerInstanceID(), UUID_SIZE);
+
bool foundResourceAtRD = false;
for(;resource && discoveryResult == OC_STACK_OK; resource = resource->next)
{
while(res)
{
char uuidString[UUID_STRING_SIZE];
- if(OCConvertUuidToString(res->sid, uuidString) != RAND_UUID_OK)
+ if(OCConvertUuidToString(payload->sid, uuidString) != RAND_UUID_OK)
{
uuidString[0]= '\0';
}
{
OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
+ payload->sid = (uint8_t*)OICMalloc(16);
payload->resources = resource;
OCResourcePayloadAddResourceType(resource, "rt.singleitem");
OCResourcePayloadAddInterface(resource, "if.singleitem");
resource->uri = OICStrdup("/uri/thing");
- resource->sid = (uint8_t*)OICMalloc(16);
uint8_t* cborData;
size_t cborSize;
TEST(DiscoveryRTandIF, SingleItemFrontTrim)
{
OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+ payload->sid = (uint8_t*)OICMalloc(16);
OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
payload->resources = resource;
OCResourcePayloadAddResourceType(resource, " rt.singleitem");
OCResourcePayloadAddInterface(resource, " if.singleitem");
resource->uri = OICStrdup("/uri/thing");
- resource->sid = (uint8_t*)OICMalloc(16);
uint8_t* cborData;
size_t cborSize;
TEST(DiscoveryRTandIF, SingleItemBackTrim)
{
OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+ payload->sid = (uint8_t*)OICMalloc(16);
OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
payload->resources = resource;
OCResourcePayloadAddResourceType(resource, "rt.singleitem ");
OCResourcePayloadAddInterface(resource, "if.singleitem ");
resource->uri = OICStrdup("/uri/thing");
- resource->sid = (uint8_t*)OICMalloc(16);
uint8_t* cborData;
size_t cborSize;
TEST(DiscoveryRTandIF, SingleItemBothTrim)
{
OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+ payload->sid = (uint8_t*)OICMalloc(16);
OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
payload->resources = resource;
OCResourcePayloadAddResourceType(resource, " rt.singleitem ");
OCResourcePayloadAddInterface(resource, " if.singleitem ");
resource->uri = OICStrdup("/uri/thing");
- resource->sid = (uint8_t*)OICMalloc(16);
uint8_t* cborData;
size_t cborSize;
TEST(DiscoveryRTandIF, MultiItemsNormal)
{
OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+ payload->sid = (uint8_t*)OICMalloc(16);
OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
payload->resources = resource;
OCResourcePayloadAddInterface(resource, "if.firstitem");
OCResourcePayloadAddInterface(resource, "if.seconditem");
resource->uri = OICStrdup("/uri/thing");
- resource->sid = (uint8_t*)OICMalloc(16);
uint8_t* cborData;
size_t cborSize;
TEST(DiscoveryRTandIF, MultiItemExtraLeadSpaces)
{
OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+ payload->sid = (uint8_t*)OICMalloc(16);
OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
payload->resources = resource;
OCResourcePayloadAddInterface(resource, " if.firstitem");
OCResourcePayloadAddInterface(resource, " if.seconditem");
resource->uri = OICStrdup("/uri/thing");
- resource->sid = (uint8_t*)OICMalloc(16);
uint8_t* cborData;
size_t cborSize;
TEST(DiscoveryRTandIF, MultiItemExtraTrailSpaces)
{
OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+ payload->sid = (uint8_t*)OICMalloc(16);
OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
payload->resources = resource;
OCResourcePayloadAddInterface(resource, "if.firstitem ");
OCResourcePayloadAddInterface(resource, "if.seconditem ");
resource->uri = OICStrdup("/uri/thing");
- resource->sid = (uint8_t*)OICMalloc(16);
uint8_t* cborData;
size_t cborSize;
TEST(DiscoveryRTandIF, MultiItemBothSpaces)
{
OCDiscoveryPayload* payload = OCDiscoveryPayloadCreate();
+ payload->sid = (uint8_t*)OICMalloc(16);
OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
payload->resources = resource;
OCResourcePayloadAddInterface(resource, " if.firstitem ");
OCResourcePayloadAddInterface(resource, " if.seconditem ");
resource->uri = OICStrdup("/uri/thing");
- resource->sid = (uint8_t*)OICMalloc(16);
uint8_t* cborData;
size_t cborSize;