}
static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *outPayload,
- size_t *size)
+ size_t *size)
{
CborEncoder encoder;
int64_t err = CborNoError;
cbor_encoder_init(&encoder, outPayload, *size, 0);
- if (payload->resources)
- {
- /*
- The format for the payload is "modelled" as JSON.
-
- [ // rootArray
- { // rootMap
- "di" : UUID, // device ID
- "rt": ["oic.wk.res"]
- "n":"MyDevice"
- "if":"oic.if.ll oic.if.baseline"
- "di": "0685B960-736F-46F7-BEC0-9E6CBD61ADC1",
- links :[ // linksArray contains maps of resources
- {
- href, rt, if, policy // Resource 1
- },
- {
- href, rt, if, policy // Resource 2
- },
- .
- .
- .
- ]
- }
- ]
- */
- // Open the main root array
- CborEncoder rootArray;
- size_t resourceCount = OCDiscoveryPayloadGetResourceCount(payload);
- err |= cbor_encoder_create_array(&encoder, &rootArray, 1);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating discovery root array");
+ /*
+ The format for the payload is "modelled" as JSON.
+
+ [ // rootArray
+ { // rootMap
+ "di" : UUID, // device ID
+ "rt": ["oic.wk.res"]
+ "n":"MyDevice"
+ "if":"oic.if.ll oic.if.baseline"
+ "di": "0685B960-736F-46F7-BEC0-9E6CBD61ADC1",
+ links :[ // linksArray contains maps of resources
+ {
+ href, rt, if, policy // Resource 1
+ },
+ {
+ href, rt, if, policy // Resource 2
+ },
+ .
+ .
+ .
+ ]
+ }
+ { // rootMap
+ ...
+ }
+ ]
+ */
+
+ // Open the main root array
+ CborEncoder rootArray;
+ err |= cbor_encoder_create_array(&encoder, &rootArray, 1);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating discovery root array");
+ while (payload && payload->resources)
+ {
// Open the root map in the root array
CborEncoder rootMap;
err |= cbor_encoder_create_map(&rootArray, &rootMap, CborIndefiniteLength);
// Insert baseURI if present
err |= ConditionalAddTextStringToMap(&rootMap, OC_RSRVD_BASE_URI,
- sizeof(OC_RSRVD_BASE_URI) - 1,
- payload->baseURI);
+ sizeof(OC_RSRVD_BASE_URI) - 1,
+ payload->baseURI);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting baseURI");
// Insert Links into the root map.
CborEncoder linkArray;
err |= cbor_encode_text_string(&rootMap, OC_RSRVD_LINKS, sizeof(OC_RSRVD_LINKS) - 1);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting links array tag");
+ size_t resourceCount = OCDiscoveryPayloadGetResourceCount(payload);
err |= cbor_encoder_create_array(&rootMap, &linkArray, resourceCount);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting links array");
- for(size_t i = 0; i < resourceCount; ++i)
+ for (size_t i = 0; i < resourceCount; ++i)
{
CborEncoder linkMap;
OCResourcePayload *resource = OCDiscoveryPayloadGetResource(payload, i);
if (resource->types)
{
err |= OCStringLLJoin(&linkMap, OC_RSRVD_RESOURCE_TYPE, resource->types);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resourceType tag/value to links map");
+ VERIFY_CBOR_SUCCESS(TAG, err,
+ "Failed adding resourceType tag/value to links map");
}
// Interface Types
if (resource->interfaces)
{
err |= OCStringLLJoin(&linkMap, OC_RSRVD_INTERFACE, resource->interfaces);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interfaces tag/value to links map");
+ VERIFY_CBOR_SUCCESS(TAG, err,
+ "Failed adding interfaces tag/value to links map");
}
// Policy
CborEncoder policyMap;
- err |= cbor_encode_text_string(&linkMap, OC_RSRVD_POLICY, sizeof(OC_RSRVD_POLICY) - 1);
+ err |= cbor_encode_text_string(&linkMap, OC_RSRVD_POLICY,
+ sizeof(OC_RSRVD_POLICY) - 1);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding policy tag to links map");
err |= cbor_encoder_create_map(&linkMap, &policyMap, CborIndefiniteLength);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding policy map to links map");
// Bitmap
- err |= cbor_encode_text_string(&policyMap, OC_RSRVD_BITMAP, sizeof(OC_RSRVD_BITMAP) - 1);
+ err |= cbor_encode_text_string(&policyMap, OC_RSRVD_BITMAP,
+ sizeof(OC_RSRVD_BITMAP) - 1);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding bitmap tag to policy map");
err |= cbor_encode_uint(&policyMap, resource->bitmap);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding bitmap value to policy map");
// Secure
err |= cbor_encode_text_string(&policyMap, OC_RSRVD_SECURE,
- sizeof(OC_RSRVD_SECURE) - 1);
+ sizeof(OC_RSRVD_SECURE) - 1);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding secure tag to policy map");
err |= cbor_encode_boolean(&policyMap, resource->secure);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding secure value to policy map");
if (resource->secure || payload->baseURI)
{
err |= cbor_encode_text_string(&policyMap, OC_RSRVD_HOSTING_PORT,
- sizeof(OC_RSRVD_HOSTING_PORT) - 1);
+ sizeof(OC_RSRVD_HOSTING_PORT) - 1);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding secure port tag");
err |= cbor_encode_uint(&policyMap, resource->port);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding secure port value");
// close root map inside the root array.
err |= cbor_encoder_close_container(&rootArray, &rootMap);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing root map");
- // Close the final root array.
- err |= cbor_encoder_close_container(&encoder, &rootArray);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing root array");
+
+ payload = payload->next;
}
+ // Close the final root array.
+ err |= cbor_encoder_close_container(&encoder, &rootArray);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing root array");
+
exit:
return checkError(err, &encoder, outPayload, size);
}