// Discovery Links Map Length.
#define LINKS_MAP_LEN 4
-// Default data model versions in CVS form
-#define DEFAULT_DATA_MODEL_VERSIONS "res.1.1.0,sh.1.1.0"
-
// Functions all return either a CborError, or a negative version of the OC_STACK return values
static int64_t OCConvertPayloadHelper(OCPayload *payload, uint8_t *outPayload, size_t *size);
static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *outPayload,
size_t *size);
-static int64_t OCConvertDevicePayload(OCDevicePayload *payload, uint8_t *outPayload,
- size_t *size);
-static int64_t OCConvertPlatformPayload(OCPlatformPayload *payload, uint8_t *outPayload,
- size_t *size);
static int64_t OCConvertRepPayload(OCRepPayload *payload, uint8_t *outPayload, size_t *size);
static int64_t OCConvertRepMap(CborEncoder *map, const OCRepPayload *payload);
+#ifdef WITH_PRESENCE
static int64_t OCConvertPresencePayload(OCPresencePayload *payload, uint8_t *outPayload,
size_t *size);
+#endif
static int64_t OCConvertSecurityPayload(OCSecurityPayload *payload, uint8_t *outPayload,
size_t *size);
static int64_t OCConvertSingleRepPayload(CborEncoder *parent, const OCRepPayload *payload);
// reallocate "out" and try again!
uint8_t *out2 = (uint8_t *)OICRealloc(out, curSize);
VERIFY_PARAM_NON_NULL(TAG, out2, "Failed to increase payload size");
+ memset(out2, 0, curSize);
out = out2;
err = OCConvertPayloadHelper(payload, out, &curSize);
while (err == CborErrorOutOfMemory)
{
uint8_t *out2 = (uint8_t *)OICRealloc(out, curSize);
VERIFY_PARAM_NON_NULL(TAG, out2, "Failed to increase payload size");
+ memset(out2, 0, curSize);
out = out2;
err = OCConvertPayloadHelper(payload, out, &curSize);
}
{
case PAYLOAD_TYPE_DISCOVERY:
return OCConvertDiscoveryPayload((OCDiscoveryPayload*)payload, outPayload, size);
- case PAYLOAD_TYPE_DEVICE:
- return OCConvertDevicePayload((OCDevicePayload*)payload, outPayload, size);
- case PAYLOAD_TYPE_PLATFORM:
- return OCConvertPlatformPayload((OCPlatformPayload*)payload, outPayload, size);
case PAYLOAD_TYPE_REPRESENTATION:
return OCConvertRepPayload((OCRepPayload*)payload, outPayload, size);
+#ifdef WITH_PRESENCE
case PAYLOAD_TYPE_PRESENCE:
return OCConvertPresencePayload((OCPresencePayload*)payload, outPayload, size);
+#endif
case PAYLOAD_TYPE_SECURITY:
return OCConvertSecurityPayload((OCSecurityPayload*)payload, outPayload, size);
default:
}
#ifdef TCP_ADAPTER
- err |= cbor_encode_text_string(&policyMap, OC_RSRVD_TCP_PORT,
- sizeof(OC_RSRVD_TCP_PORT) - 1);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tcp port tag");
- err |= cbor_encode_uint(&policyMap, resource->tcpPort);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tcp port value");
+#ifdef __WITH_TLS__
+ // tls
+ if (resource->secure)
+ {
+ err |= cbor_encode_text_string(&policyMap, OC_RSRVD_TLS_PORT,
+ sizeof(OC_RSRVD_TLS_PORT) - 1);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tcp secure port tag");
+ err |= cbor_encode_uint(&policyMap, resource->tcpPort);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tcp secure port value");
+ }
+
+ // tcp
+ else
+#endif
+ {
+ err |= cbor_encode_text_string(&policyMap, OC_RSRVD_TCP_PORT,
+ sizeof(OC_RSRVD_TCP_PORT) - 1);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tcp port tag");
+ err |= cbor_encode_uint(&policyMap, resource->tcpPort);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding tcp port value");
+ }
#endif
err |= cbor_encoder_close_container(&linkMap, &policyMap);
return checkError(err, &encoder, outPayload, size);
}
-static int64_t OCConvertDevicePayload(OCDevicePayload *payload, uint8_t *outPayload,
- size_t *size)
-{
- if (!payload)
- {
- return CborUnknownError;
- }
- int64_t err = CborNoError;
- CborEncoder encoder;
- char *dataModelVersions = 0;
-
- cbor_encoder_init(&encoder, outPayload, *size, 0);
- CborEncoder repMap;
- err |= cbor_encoder_create_map(&encoder, &repMap, CborIndefiniteLength);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating device map");
-
- // Resource Type
- if (payload->types)
- {
- OIC_LOG(INFO, TAG, "Payload has types");
- err |= OCStringLLJoin(&repMap, OC_RSRVD_RESOURCE_TYPE, payload->types);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource type tag/value.");
- }
-
- if (payload->interfaces)
- {
- OIC_LOG(INFO, TAG, "Payload has interface");
- err |= OCStringLLJoin(&repMap, OC_RSRVD_INTERFACE, payload->interfaces);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interface type tag/value.");
- }
-
- // Device ID
- err |= AddTextStringToMap(&repMap, OC_RSRVD_DEVICE_ID, sizeof(OC_RSRVD_DEVICE_ID) - 1 , payload->sid);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding device id");
-
- // Device Name
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DEVICE_NAME,
- sizeof(OC_RSRVD_DEVICE_NAME) - 1, payload->deviceName);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding device name");
-
- // Device Spec Version
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SPEC_VERSION,
- sizeof(OC_RSRVD_SPEC_VERSION) - 1, payload->specVersion);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding data spec version");
-
- // Device data Model Versions
- if (payload->dataModelVersions)
- {
- OIC_LOG(INFO, TAG, "Payload has data model versions");
- dataModelVersions = OCCreateString(payload->dataModelVersions);
- }
- else
- {
- dataModelVersions = OICStrdup(DEFAULT_DATA_MODEL_VERSIONS);
- }
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DATA_MODEL_VERSION,
- sizeof(OC_RSRVD_DATA_MODEL_VERSION) - 1, dataModelVersions);
- OICFree(dataModelVersions);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding data model versions");
-
- err |= cbor_encoder_close_container(&encoder, &repMap);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing device map");
-
-exit:
- return checkError(err, &encoder, outPayload, size);
-}
-
-static int64_t OCConvertPlatformPayload(OCPlatformPayload *payload, uint8_t *outPayload,
- size_t *size)
-{
- int64_t err = CborNoError;
- CborEncoder encoder;
-
- cbor_encoder_init(&encoder, outPayload, *size, 0);
-
- CborEncoder repMap;
- err |= cbor_encoder_create_map(&encoder, &repMap, CborIndefiniteLength);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating platform map");
-
- // Platform ID
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_PLATFORM_ID,
- sizeof(OC_RSRVD_PLATFORM_ID) - 1, payload->info.platformID);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform id");
-
- // MFG Name
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_NAME,
- sizeof(OC_RSRVD_MFG_NAME) - 1, payload->info.manufacturerName);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding mfg name");
-
- // MFG Url
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_URL,
- sizeof(OC_RSRVD_MFG_URL) - 1, payload->info.manufacturerUrl);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding mfg url");
-
- // Model Num
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MODEL_NUM,
- sizeof(OC_RSRVD_MODEL_NUM) -1, payload->info.modelNumber);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding model num");
-
- // Date of Mfg
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_DATE,
- sizeof(OC_RSRVD_MFG_DATE) - 1, payload->info.dateOfManufacture);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding mfg date");
-
- // Platform Version
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_PLATFORM_VERSION,
- sizeof(OC_RSRVD_PLATFORM_VERSION) - 1, payload->info.platformVersion);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform version");
-
- // OS Version
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_OS_VERSION,
- sizeof(OC_RSRVD_OS_VERSION) - 1, payload->info.operatingSystemVersion);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding OS version");
-
- // Hardware Version
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_HARDWARE_VERSION,
- sizeof(OC_RSRVD_HARDWARE_VERSION) - 1, payload->info.hardwareVersion);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding HW version");
-
- // Firmware Version
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_FIRMWARE_VERSION,
- sizeof(OC_RSRVD_FIRMWARE_VERSION) - 1, payload->info.firmwareVersion);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding firmware version");
-
- // Support URL
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SUPPORT_URL,
- sizeof(OC_RSRVD_SUPPORT_URL) - 1, payload->info.supportUrl);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding support url");
-
- // System Time
- err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SYSTEM_TIME,
- sizeof(OC_RSRVD_SYSTEM_TIME) - 1, payload->info.systemTime);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding system time");
-
- // Resource type
- if (payload->rt)
- {
- err |= OCStringLLJoin(&repMap, OC_RSRVD_RESOURCE_TYPE, payload->rt);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource type.");
- }
-
- // Resource interfaces
- if (payload->interfaces)
- {
- err |= OCStringLLJoin(&repMap, OC_RSRVD_INTERFACE, payload->interfaces);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform interface type.");
- }
-
- // Close Map
- err |= cbor_encoder_close_container(&encoder, &repMap);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep map");
-
-exit:
- return checkError(err, &encoder, outPayload, size);
-}
-
static int64_t OCConvertArrayItem(CborEncoder *array, const OCRepPayloadValueArray *valArray,
size_t index)
{
err = CborUnknownError;
break;
case OCREP_PROP_INT:
- err |= cbor_encode_int(array, valArray->iArray[index]);
+ if (valArray->iArray != 0)
+ {
+ err |= cbor_encode_int(array, valArray->iArray[index]);
+ }
break;
case OCREP_PROP_DOUBLE:
- err |= cbor_encode_double(array, valArray->dArray[index]);
+ if (valArray->dArray != 0)
+ {
+ err |= cbor_encode_double(array, valArray->dArray[index]);
+ }
break;
case OCREP_PROP_BOOL:
- err |= cbor_encode_boolean(array, valArray->bArray[index]);
- break;
- case OCREP_PROP_STRING:
- if (!valArray->strArray[index])
+ if (valArray->bArray != 0)
{
- err |= cbor_encode_null(array);
+ err |= cbor_encode_boolean(array, valArray->bArray[index]);
}
- else
+ break;
+ case OCREP_PROP_STRING:
+ if (valArray->strArray != 0)
{
- err |= cbor_encode_text_string(array, valArray->strArray[index],
- strlen(valArray->strArray[index]));
+ err |= (!valArray->strArray[index]) ? cbor_encode_null(array) : cbor_encode_text_string(array,
+ valArray->strArray[index], strlen(valArray->strArray[index]));
}
break;
case OCREP_PROP_BYTE_STRING:
- if (!valArray->ocByteStrArray[index].len)
- {
- err |= cbor_encode_null(array);
- }
- else
- {
- err |= cbor_encode_byte_string(array, valArray->ocByteStrArray[index].bytes,
- valArray->ocByteStrArray[index].len);
- }
+ err |= (!valArray->ocByteStrArray[index].len) ? cbor_encode_null(array) : cbor_encode_byte_string(array,
+ valArray->ocByteStrArray[index].bytes, valArray->ocByteStrArray[index].len);
break;
case OCREP_PROP_OBJECT:
- if (!valArray->objArray[index])
- {
- err |= cbor_encode_null(array);
- }
- else
+ if (valArray->objArray != 0)
{
- err |= OCConvertRepMap(array, valArray->objArray[index]);
+ err |= (!valArray->objArray[index]) ? cbor_encode_null(array): OCConvertRepMap(array,
+ valArray->objArray[index]);
}
break;
case OCREP_PROP_ARRAY:
CborEncoder array;
err |= cbor_encoder_create_array(parent, &array, valArray->dimensions[0]);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array");
-
- for (size_t i = 0; i < valArray->dimensions[0]; ++i)
+ // empty array
+ if (valArray->dimensions[0] == 0)
+ {
+ err |= OCConvertArrayItem(&array, valArray, 0);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array value");
+ }
+ else
{
- if (0 != valArray->dimensions[1])
+ for (size_t i = 0; i < valArray->dimensions[0]; ++i)
{
- CborEncoder array2;
- err |= cbor_encoder_create_array(&array, &array2, valArray->dimensions[1]);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array2");
-
- for (size_t j = 0; j < valArray->dimensions[1]; ++j)
+ if (0 != valArray->dimensions[1])
{
- if (0 != valArray->dimensions[2])
+ CborEncoder array2;
+ err |= cbor_encoder_create_array(&array, &array2, valArray->dimensions[1]);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array2");
+
+ for (size_t j = 0; j < valArray->dimensions[1]; ++j)
{
- CborEncoder array3;
- err |= cbor_encoder_create_array(&array2, &array3, valArray->dimensions[2]);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array3");
+ if (0 != valArray->dimensions[2])
+ {
+ CborEncoder array3;
+ err |= cbor_encoder_create_array(&array2, &array3, valArray->dimensions[2]);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array3");
- for(size_t k = 0; k < valArray->dimensions[2]; ++k)
+ for(size_t k = 0; k < valArray->dimensions[2]; ++k)
+ {
+ err |= OCConvertArrayItem(&array3, valArray,
+ j * valArray->dimensions[2] +
+ i * valArray->dimensions[2] * valArray->dimensions[1] +
+ k);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array3 value");
+ }
+ err |= cbor_encoder_close_container(&array2, &array3);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep array3");
+ }
+ else
{
- err |= OCConvertArrayItem(&array3, valArray,
- j * valArray->dimensions[2] +
- i * valArray->dimensions[2] * valArray->dimensions[1] +
- k);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array3 value");
+ err |= OCConvertArrayItem(&array2, valArray, i * valArray->dimensions[1] + j);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array2 value");
}
- err |= cbor_encoder_close_container(&array2, &array3);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep array3");
- }
- else
- {
- err |= OCConvertArrayItem(&array2, valArray, i * valArray->dimensions[1] + j);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array2 value");
}
+ err |= cbor_encoder_close_container(&array, &array2);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep array2");
+ }
+ else
+ {
+ err |= OCConvertArrayItem(&array, valArray, i);
+ VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array value");
}
- err |= cbor_encoder_close_container(&array, &array2);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep array2");
- }
- else
- {
- err |= OCConvertArrayItem(&array, valArray, i);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep array value");
}
}
err |= cbor_encoder_close_container(parent, &array);
return checkError(err, &encoder, outPayload, size);
}
+#ifdef WITH_PRESENCE
static int64_t OCConvertPresencePayload(OCPresencePayload *payload, uint8_t *outPayload,
size_t *size)
{
exit:
return checkError(err, &encoder, outPayload, size);
}
+#endif // WITH_PRESENCE
static int64_t AddTextStringToMap(CborEncoder* map, const char* key, size_t keylen,
const char* value)