int64_t err = 0;
cbor_encoder_init(&encoder, outPayload, *size, 0);
- CborEncoder rootMap;
- err = err | cbor_encoder_create_map(&encoder, &rootMap, CborIndefiniteLength);
+ CborEncoder rootMap ;
- if (payload->types)
+ size_t arrayCount = 0;
+ for (OCRepPayload *temp = payload; temp; temp = temp->next)
{
- OC_LOG(INFO, TAG, "Payload has types or interfaces");
- char* joinedTypes = OCStringLLJoin(payload->types);
- if (joinedTypes)
- {
- err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_RESOURCE_TYPE,
- sizeof(OC_RSRVD_RESOURCE_TYPE) - 1);
- err = err | cbor_encode_text_string(&rootMap, joinedTypes,
- strlen(joinedTypes));
- OICFree(joinedTypes);
- }
- else
- {
- return OC_STACK_NO_MEMORY;
- }
+ arrayCount++;
+ }
+ CborEncoder rootArray;
+ if (arrayCount > 1)
+ {
+ err = err | cbor_encoder_create_array(&encoder, &rootArray, arrayCount);
}
- if (payload->interfaces)
+
+ while (payload != NULL && (err == CborNoError))
{
- char* joinedInterfaces = OCStringLLJoin(payload->interfaces);
- if (joinedInterfaces)
+ err = err | cbor_encoder_create_map(((arrayCount == 1)? &encoder: &rootArray),
+ &rootMap, CborIndefiniteLength);
+ // Only in case of collection href is included.
+ if (arrayCount > 1 && payload->uri && strlen(payload->uri) > 0)
{
- err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_INTERFACE,
- sizeof(OC_RSRVD_INTERFACE) - 1);
- err = err | cbor_encode_text_string(&rootMap, joinedInterfaces,
- strlen(joinedInterfaces));
- OICFree(joinedInterfaces);
+ OC_LOG(INFO, TAG, "Payload has uri");
+ err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_HREF,
+ strlen(OC_RSRVD_HREF));
+ err = err | cbor_encode_text_string(&rootMap, payload->uri,
+ strlen(payload->uri));
}
- else
+ if (payload->types)
{
- return OC_STACK_NO_MEMORY;
+ OC_LOG(INFO, TAG, "Payload has types");
+ char* joinedTypes = OCStringLLJoin(payload->types);
+ if (joinedTypes)
+ {
+ err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_RESOURCE_TYPE,
+ strlen(OC_RSRVD_RESOURCE_TYPE));
+ err = err | cbor_encode_text_string(&rootMap, joinedTypes,
+ strlen(joinedTypes));
+ OICFree(joinedTypes);
+ }
+ else
+ {
+ return OC_STACK_NO_MEMORY;
+ }
+ }
+ if (payload->interfaces)
+ {
+ OC_LOG(INFO, TAG, "Payload has interfaces");
+ char* joinedInterfaces = OCStringLLJoin(payload->interfaces);
+ if (joinedInterfaces)
+ {
+ err = err | cbor_encode_text_string(&rootMap, OC_RSRVD_INTERFACE,
+ strlen(OC_RSRVD_INTERFACE));
+ err = err | cbor_encode_text_string(&rootMap, joinedInterfaces,
+ strlen(joinedInterfaces));
+ OICFree(joinedInterfaces);
+ }
+ else
+ {
+ return OC_STACK_NO_MEMORY;
+ }
}
- }
- while(payload != NULL && (err == 0 || err == CborErrorOutOfMemory))
- {
err = err | OCConvertSingleRepPayload(&rootMap, payload);
+ err = err | cbor_encoder_close_container(((arrayCount == 1) ? &encoder: &rootArray),
+ &rootMap);
payload = payload->next;
}
-
- // Close main array
- err = err | cbor_encoder_close_container(&encoder, &rootMap);
+ if (arrayCount > 1)
+ {
+ err = err | cbor_encoder_close_container(&encoder, &rootArray);
+ }
return checkError(err, &encoder, outPayload, size);
}