replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / resource / csdk / stack / src / ocpayloadconvert.c
old mode 100644 (file)
new mode 100755 (executable)
index e1edc0d..daa9003
 //
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
+#ifdef ARDUINO
+#define __STDC_LIMIT_MACROS
+#endif
+
 #include "ocpayloadcbor.h"
 #include "platform_features.h"
 #include <stdlib.h>
@@ -28,7 +32,6 @@
 #include "ocrandom.h"
 #include "ocresourcehandler.h"
 #include "cbor.h"
-#include "rdpayload.h"
 
 #define TAG "OIC_RI_PAYLOADCONVERT"
 
 // 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);
@@ -104,12 +102,14 @@ OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t*
         // 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);
         }
@@ -145,18 +145,14 @@ static int64_t OCConvertPayloadHelper(OCPayload* payload, uint8_t* outPayload, s
     {
         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);
-        case PAYLOAD_TYPE_RD:
-            return OCRDPayloadToCbor((OCRDPayload*)payload, outPayload, size);
         default:
             OIC_LOG_V(INFO,TAG, "ConvertPayload default %d", payload->type);
             return CborErrorUnknownType;
@@ -167,7 +163,7 @@ static int64_t checkError(int64_t err, CborEncoder* encoder, uint8_t* outPayload
 {
     if (err == CborErrorOutOfMemory)
     {
-        *size += encoder->ptr - encoder->end;
+        *size += cbor_encoder_get_extra_bytes_needed(encoder);
         return err;
     }
     else if (err != CborNoError)
@@ -177,7 +173,7 @@ static int64_t checkError(int64_t err, CborEncoder* encoder, uint8_t* outPayload
     }
     else
     {
-        *size = encoder->ptr - outPayload;
+        *size = cbor_encoder_get_buffer_size(encoder, outPayload);
         return err;
     }
 }
@@ -362,11 +358,27 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *o
             }
 
 #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);
@@ -394,162 +406,6 @@ exit:
     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)
 {
@@ -561,44 +417,39 @@ static int64_t OCConvertArrayItem(CborEncoder *array, const OCRepPayloadValueArr
             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->strArray[index])
-            {
-                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:
@@ -616,47 +467,55 @@ static int64_t OCConvertArray(CborEncoder *parent, const OCRepPayloadValueArray
     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);
@@ -794,6 +653,7 @@ exit:
     return checkError(err, &encoder, outPayload, size);
 }
 
+#ifdef WITH_PRESENCE
 static int64_t OCConvertPresencePayload(OCPresencePayload *payload, uint8_t *outPayload,
         size_t *size)
 {
@@ -838,6 +698,7 @@ static int64_t OCConvertPresencePayload(OCPresencePayload *payload, uint8_t *out
 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)