replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / resource / csdk / stack / src / ocpayloadconvert.c
old mode 100644 (file)
new mode 100755 (executable)
index dd8acf3..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"
 
 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);
@@ -65,7 +66,7 @@ OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t*
     // TinyCbor Version 47a78569c0 or better on master is required for the re-allocation
     // strategy to work.  If you receive the following assertion error, please do a git-pull
     // from the extlibs/tinycbor/tinycbor directory
-    #define CborNeedsUpdating  (CborErrorOutOfMemory < CborErrorDataTooLarge)
+    #define CborNeedsUpdating  (((unsigned int)CborErrorOutOfMemory) < ((unsigned int)CborErrorDataTooLarge))
     OC_STATIC_ASSERT(!CborNeedsUpdating, "tinycbor needs to be updated to at least 47a78569c0");
     #undef CborNeedsUpdating
 
@@ -101,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);
         }
@@ -142,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;
@@ -164,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)
@@ -174,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;
     }
 }
@@ -188,76 +187,74 @@ static int64_t OCConvertSecurityPayload(OCSecurityPayload* payload, uint8_t* out
     return CborNoError;
 }
 
-static char* OCStringLLJoin(OCStringLL* val)
+static int64_t OCStringLLJoin(CborEncoder *map, char *type, OCStringLL *val)
 {
-    OCStringLL* temp = val;
-    size_t size = strlen(temp->value);
+    uint16_t count = 0;
+    int64_t err = CborNoError;
 
-    while (temp->next)
+    for (OCStringLL *temp = val; temp; temp = temp->next)
     {
-        ++size;
-        temp = temp->next;
-        size += strlen(temp->value);
+        ++count;
     }
-
-    char* joinedStr = (char*)OICCalloc(sizeof(char), size + 1);
-
-    if (!joinedStr)
+    if (count > 0)
     {
-        return NULL;
+        CborEncoder array;
+        err |= cbor_encode_text_string(map, type, strlen(type));
+        err |= cbor_encoder_create_array(map, &array, count);
+        while (val)
+        {
+            err |= cbor_encode_text_string(&array, val->value, strlen(val->value));
+            val = val->next;
+        }
+        err |= cbor_encoder_close_container(map, &array);
     }
 
-    OICStrcat(joinedStr, size + 1, val->value);
-    while (val->next)
-    {
-        val = val->next;
-        OICStrcat(joinedStr, size + 1, " ");
-        OICStrcat(joinedStr, size + 1, val->value);
-    }
-    return joinedStr;
+    return err;
 }
 
 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
-                "href": "/oic/res"
-                "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);
@@ -268,48 +265,37 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *o
                 sizeof(OC_RSRVD_DEVICE_NAME) - 1, payload->name);
         VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting name");
 
-        // Insert URI
-        err |= ConditionalAddTextStringToMap(&rootMap, OC_RSRVD_HREF, sizeof(OC_RSRVD_HREF) - 1,
-                payload->uri);
-        VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting href");
-
         // Insert Device ID into the root map
         err |= AddTextStringToMap(&rootMap, OC_RSRVD_DEVICE_ID, sizeof(OC_RSRVD_DEVICE_ID) - 1,
                 payload->sid);
         VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting device id");
 
         // Insert Resource Type
-        err |= ConditionalAddTextStringToMap(&rootMap, OC_RSRVD_RESOURCE_TYPE,
-                sizeof(OC_RSRVD_RESOURCE_TYPE) - 1, payload->type);
+        err |= OCStringLLJoin(&rootMap, OC_RSRVD_RESOURCE_TYPE, payload->type);
         VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting RT");
 
         // Insert interfaces
-        if (payload->interface)
+        if (payload->iface)
         {
-            err |= cbor_encode_text_string(&rootMap, OC_RSRVD_INTERFACE,
-                    sizeof(OC_RSRVD_INTERFACE) - 1);
-            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interface types tag");
-            char *joinedTypes = OCStringLLJoin(payload->interface);
-            VERIFY_PARAM_NON_NULL(TAG, joinedTypes, "Failed creating joined string");
-            err |= cbor_encode_text_string(&rootMap, joinedTypes, strlen(joinedTypes));
-            OICFree(joinedTypes);
-            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interface types value");
+            err |= OCStringLLJoin(&rootMap, OC_RSRVD_INTERFACE, payload->iface);
+            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interface types tag/value");
         }
 
         // 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);
@@ -328,58 +314,73 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *o
             // Resource Type
             if (resource->types)
             {
-                err |= cbor_encode_text_string(&linkMap, OC_RSRVD_RESOURCE_TYPE,
-                        sizeof(OC_RSRVD_RESOURCE_TYPE) - 1);
-                VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource types tag to links map");
-                char *joinedTypes = OCStringLLJoin(resource->types);
-                VERIFY_PARAM_NON_NULL(TAG, joinedTypes, "Failed creating joined string");
-                err |= cbor_encode_text_string(&linkMap, joinedTypes, strlen(joinedTypes));
-                OICFree(joinedTypes);
-                VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource types value to links map");
+                err |= OCStringLLJoin(&linkMap, OC_RSRVD_RESOURCE_TYPE, resource->types);
+                VERIFY_CBOR_SUCCESS(TAG, err,
+                                    "Failed adding resourceType tag/value to links map");
             }
             // Interface Types
             if (resource->interfaces)
             {
-                err |= cbor_encode_text_string(&linkMap, OC_RSRVD_INTERFACE,
-                        sizeof(OC_RSRVD_INTERFACE) - 1);
-                VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interfaces tag to links map");
-                char* joinedInterfaces = OCStringLLJoin(resource->interfaces);
-                VERIFY_PARAM_NON_NULL(TAG, joinedInterfaces, "Failed creating joined string");
-                err |= cbor_encode_text_string(&linkMap, joinedInterfaces, strlen(joinedInterfaces));
-                OICFree(joinedInterfaces);
-                VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interfaces value to links map");
+                err |= OCStringLLJoin(&linkMap, OC_RSRVD_INTERFACE, resource->interfaces);
+                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");
 
-            if (resource->secure)
-            {
-                err |= cbor_encode_text_string(&policyMap, OC_RSRVD_SECURE,
-                        sizeof(OC_RSRVD_SECURE) - 1);
-                VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding secure tag to policy map");
-                err |= cbor_encode_boolean(&policyMap, OC_RESOURCE_SECURE);
-                VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding secure value to policy map");
-            }
-            if ((resource->secure && resource->port != 0) || payload->baseURI)
+            // Secure
+            err |= cbor_encode_text_string(&policyMap, OC_RSRVD_SECURE,
+                                           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");
             }
 
+#ifdef TCP_ADAPTER
+#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);
             VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing policy map");
 
@@ -393,174 +394,13 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload *payload, uint8_t *o
         // 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");
-    }
-
-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;
-
-    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 |= cbor_encode_text_string(&repMap, OC_RSRVD_RESOURCE_TYPE,
-                sizeof(OC_RSRVD_RESOURCE_TYPE) - 1);
-        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep resource type tag");
-        char *joinedTypes = OCStringLLJoin(payload->types);
-        VERIFY_PARAM_NON_NULL(TAG, joinedTypes, "Failed creating joined string");
-        err |= cbor_encode_text_string(&repMap, joinedTypes, strlen(joinedTypes));
-        OICFree(joinedTypes);
-        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep resource type value");
-    }
-
-    if (payload->interfaces)
-    {
-        OIC_LOG(INFO, TAG, "Payload has interface");
-        err |= cbor_encode_text_string(&repMap, OC_RSRVD_INTERFACE,
-                sizeof(OC_RSRVD_INTERFACE) - 1);
-        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding interface type tag");
-        char *joinedTypes = OCStringLLJoin(payload->interfaces);
-        VERIFY_PARAM_NON_NULL(TAG, joinedTypes, "Failed creating joined string");
-        err |= cbor_encode_text_string(&repMap, joinedTypes, strlen(joinedTypes));
-        OICFree(joinedTypes);
-        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep resource type 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 Version
-    err |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DATA_MODEL_VERSION,
-            sizeof(OC_RSRVD_DATA_MODEL_VERSION) - 1, payload->dataModelVersion);
-    VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding data model version");
-
-    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 |= ConditionalAddTextStringToMap(&repMap, OC_RSRVD_RESOURCE_TYPE,
-                sizeof(OC_RSRVD_RESOURCE_TYPE) - 1, payload->rt);
-        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource type");
-    }
-
-    // Resource interfaces
-    if (payload->interfaces)
-    {
-        err |= cbor_encode_text_string(&repMap, OC_RSRVD_INTERFACE,
-                sizeof(OC_RSRVD_INTERFACE) - 1);
-        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform interface tag");
-        char* joinedInterfaces = OCStringLLJoin(payload->interfaces);
-        VERIFY_PARAM_NON_NULL(TAG, joinedInterfaces, "Failed creating joined string");
-        err |= cbor_encode_text_string(&repMap, joinedInterfaces, strlen(joinedInterfaces));
-        OICFree(joinedInterfaces);
-        VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform interface value");
+        payload = payload->next;
     }
 
-    // Close Map
-    err |= cbor_encoder_close_container(&encoder, &repMap);
-    VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing rep map");
+    // 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);
@@ -577,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])
+            if (valArray->objArray != 0)
             {
-                err |= cbor_encode_null(array);
-            }
-            else
-            {
-                err |= OCConvertRepMap(array, valArray->objArray[index]);
+                err |= (!valArray->objArray[index]) ? cbor_encode_null(array): OCConvertRepMap(array,
+                        valArray->objArray[index]);
             }
             break;
         case OCREP_PROP_ARRAY:
@@ -632,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 array3;
-                    err |= cbor_encoder_create_array(&array2, &array3, valArray->dimensions[2]);
-                    VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array3");
+                CborEncoder array2;
+                err |= cbor_encoder_create_array(&array, &array2, valArray->dimensions[1]);
+                VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating rep array2");
 
-                    for(size_t k = 0; k < valArray->dimensions[2]; ++k)
+                for (size_t j = 0; j < valArray->dimensions[1]; ++j)
+                {
+                    if (0 != valArray->dimensions[2])
                     {
-                        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");
+                        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)
+                        {
+                            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(&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);
@@ -781,26 +624,14 @@ static int64_t OCConvertRepPayload(OCRepPayload *payload, uint8_t *outPayload, s
         if (payload->types)
         {
             OIC_LOG(INFO, TAG, "Payload has types");
-            err |= cbor_encode_text_string(&rootMap, OC_RSRVD_RESOURCE_TYPE,
-                    sizeof(OC_RSRVD_RESOURCE_TYPE) - 1);
-            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep resource type tag");
-            char* joinedTypes = OCStringLLJoin(payload->types);
-            VERIFY_PARAM_NON_NULL(TAG, joinedTypes, "Failed creating joined string");
-            err |= cbor_encode_text_string(&rootMap, joinedTypes, strlen(joinedTypes));
-            OICFree(joinedTypes);
-            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep resource type value");
+            err |= OCStringLLJoin(&rootMap, OC_RSRVD_RESOURCE_TYPE, payload->types);
+            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding resource type.");
         }
         if (payload->interfaces)
         {
             OIC_LOG(INFO, TAG, "Payload has interfaces");
-            err |= cbor_encode_text_string(&rootMap, OC_RSRVD_INTERFACE,
-                    sizeof(OC_RSRVD_INTERFACE) - 1);
-            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep interface tag");
-            char* joinedInterfaces = OCStringLLJoin(payload->interfaces);
-            VERIFY_PARAM_NON_NULL(TAG, joinedInterfaces, "Failed creating joined string");
-            err |= cbor_encode_text_string(&rootMap, joinedInterfaces, strlen(joinedInterfaces));
-            OICFree(joinedInterfaces);
-            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding rep interface value");
+            err |= OCStringLLJoin(&rootMap, OC_RSRVD_INTERFACE, payload->interfaces);
+            VERIFY_CBOR_SUCCESS(TAG, err, "Failed adding platform interface type.");
         }
 
         err |= OCConvertSingleRepPayload(&rootMap, payload);
@@ -822,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)
 {
@@ -866,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)