Merge branch '1.1-rel'
[platform/upstream/iotivity.git] / resource / csdk / stack / src / ocpayloadparse.c
index f577a17..6373767 100755 (executable)
@@ -44,7 +44,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *a
 static CborError OCParseSingleRepPayload(OCRepPayload **outPayload, CborValue *repParent, bool isRoot);
 static OCStackResult OCParseRepPayload(OCPayload **outPayload, CborValue *arrayVal);
 static OCStackResult OCParsePresencePayload(OCPayload **outPayload, CborValue *arrayVal);
-static OCStackResult OCParseSecurityPayload(OCPayload **outPayload, CborValue * rrayVal);
+static OCStackResult OCParseSecurityPayload(OCPayload **outPayload, const uint8_t *payload, size_t size);
 
 OCStackResult OCParsePayload(OCPayload **outPayload, OCPayloadType payloadType,
         const uint8_t *payload, size_t payloadSize)
@@ -55,7 +55,9 @@ OCStackResult OCParsePayload(OCPayload **outPayload, OCPayloadType payloadType,
     VERIFY_PARAM_NON_NULL(TAG, outPayload, "Conversion of outPayload failed");
     VERIFY_PARAM_NON_NULL(TAG, payload, "Invalid cbor payload value");
 
-    OIC_LOG_V(INFO, TAG, "CBOR Parsing size: %zu", payloadSize);
+    OIC_LOG_V(INFO, TAG, "CBOR Parsing size: %zu of Payload Type: %d, Payload:",
+            payloadSize, payloadType);
+    OIC_LOG_BUFFER(DEBUG, TAG, payload, payloadSize);
 
     CborParser parser;
     CborValue rootValue;
@@ -81,7 +83,7 @@ OCStackResult OCParsePayload(OCPayload **outPayload, OCPayloadType payloadType,
             result = OCParsePresencePayload(outPayload, &rootValue);
             break;
         case PAYLOAD_TYPE_SECURITY:
-            result = OCParseSecurityPayload(outPayload, &rootValue);
+            result = OCParseSecurityPayload(outPayload, payload, payloadSize);
             break;
         case PAYLOAD_TYPE_RD:
             result = OCRDCborToPayload(&rootValue, outPayload);
@@ -100,33 +102,18 @@ exit:
 
 void OCFreeOCStringLL(OCStringLL* ll);
 
-static OCStackResult OCParseSecurityPayload(OCPayload** outPayload, CborValue* rootValue)
+static OCStackResult OCParseSecurityPayload(OCPayload** outPayload, const uint8_t *payload,
+        size_t size)
 {
-    OCStackResult ret = OC_STACK_MALFORMED_RESPONSE;
-    CborError err;
-    char *securityData = NULL;
-
-    VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid parameter");
-    VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid cbor");
-
-    CborValue strVal;
-
-    err = cbor_value_enter_container(rootValue, &strVal);
-    VERIFY_CBOR_SUCCESS(TAG, err, "Failed entering container");
-    if (cbor_value_is_text_string(&strVal))
+    if (size > 0)
     {
-        size_t len = 0;
-        err = cbor_value_dup_text_string(&strVal, &securityData, &len, NULL);
-        VERIFY_CBOR_SUCCESS(TAG, err, "Failed reading security data");
-        *outPayload = (OCPayload *)OCSecurityPayloadCreate(securityData);
-        VERIFY_PARAM_NON_NULL(TAG, *outPayload, "Invalid cbor");
-        ret = OC_STACK_OK;
+        *outPayload = (OCPayload *)OCSecurityPayloadCreate(payload, size);
     }
-
-exit:
-    OICFree(securityData);
-    return ret;
-
+    else
+    {
+        *outPayload = NULL;
+    }
+    return OC_STACK_OK;
 }
 
 static char* InPlaceStringTrim(char* str)
@@ -409,6 +396,8 @@ static OCStackResult OCParseDevicePayload(OCPayload **outPayload, CborValue *roo
         CborValue curVal;
         // Resource Type
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_RESOURCE_TYPE, &curVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find resource type tag");
+
         if (cbor_value_is_valid(&curVal))
         {
             err =  OCParseStringLL(rootValue, OC_RSRVD_RESOURCE_TYPE, &out->types);
@@ -425,6 +414,7 @@ static OCStackResult OCParseDevicePayload(OCPayload **outPayload, CborValue *roo
         // Device ID
         size_t len = 0;
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_DEVICE_ID, &curVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find device id tag");
         if (cbor_value_is_valid(&curVal))
         {
             if (cbor_value_is_byte_string(&curVal))
@@ -440,6 +430,7 @@ static OCStackResult OCParseDevicePayload(OCPayload **outPayload, CborValue *roo
         }
         // Device Name
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_DEVICE_NAME, &curVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find device name tag");
         if (cbor_value_is_valid(&curVal))
         {
             err = cbor_value_dup_text_string(&curVal, &out->deviceName, &len, NULL);
@@ -447,6 +438,7 @@ static OCStackResult OCParseDevicePayload(OCPayload **outPayload, CborValue *roo
         }
         // Device Spec Version
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_SPEC_VERSION, &curVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find spec ver tag");
         if (cbor_value_is_valid(&curVal))
         {
             err = cbor_value_dup_text_string(&curVal, &out->specVersion, &len, NULL);
@@ -454,6 +446,7 @@ static OCStackResult OCParseDevicePayload(OCPayload **outPayload, CborValue *roo
         }
         // Data Model Version
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_DATA_MODEL_VERSION, &curVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find data model ver tag");
         if (cbor_value_is_valid(&curVal))
         {
             err = cbor_value_dup_text_string(&curVal, &out->dataModelVersion, &len, NULL);
@@ -490,6 +483,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
 
         // Platform ID
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_PLATFORM_ID, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find platform id tag");
         if (cbor_value_is_valid(&repVal))
         {
             err = cbor_value_dup_text_string(&repVal, &(info.platformID), &len, NULL);
@@ -497,6 +491,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
         }
          // MFG Name
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_MFG_NAME, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find mfg name tag");
         if (cbor_value_is_valid(&repVal))
         {
             err = cbor_value_dup_text_string(&repVal, &(info.manufacturerName), &len, NULL);
@@ -504,6 +499,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
         }
         // MFG URL
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_MFG_URL, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find mfg url tag");
         if (cbor_value_is_valid(&repVal))
         {
             err = cbor_value_dup_text_string(&repVal, &(info.manufacturerUrl), &len, NULL);
@@ -511,6 +507,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
         }
         // Model Num
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_MODEL_NUM, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find model num tag");
         if (cbor_value_is_valid(&repVal))
         {
             err = cbor_value_dup_text_string(&repVal, &(info.modelNumber), &len, NULL);
@@ -518,6 +515,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
         }
         // Date of Mfg
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_MFG_DATE, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find mfg date tag");
         if (cbor_value_is_valid(&repVal))
         {
             err = cbor_value_dup_text_string(&repVal, &(info.dateOfManufacture), &len, NULL);
@@ -525,6 +523,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
         }
         // Platform Version
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_PLATFORM_VERSION, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find platform ver tag");
         if (cbor_value_is_valid(&repVal))
         {
             err = cbor_value_dup_text_string(&repVal, &(info.platformVersion), &len, NULL);
@@ -532,6 +531,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
         }
         // OS Version
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_OS_VERSION, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find os ver tag");
         if (cbor_value_is_valid(&repVal))
         {
             err = cbor_value_dup_text_string(&repVal, &(info.operatingSystemVersion), &len, NULL);
@@ -539,6 +539,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
         }
         // Hardware Version
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_HARDWARE_VERSION, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find hw ver tag");
         if(cbor_value_is_valid(&repVal))
         {
             err = cbor_value_dup_text_string(&repVal, &(info.hardwareVersion), &len, NULL);
@@ -546,6 +547,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
         }
         // Firmware Version
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_FIRMWARE_VERSION, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find fw ver tag");
         if(cbor_value_is_valid(&repVal))
         {
             err = cbor_value_dup_text_string(&repVal, &(info.firmwareVersion), &len, NULL);
@@ -553,6 +555,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
         }
         // Support URL
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_SUPPORT_URL, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find support url tag");
         if(cbor_value_is_valid(&repVal))
         {
             err = cbor_value_dup_text_string(&repVal, &(info.supportUrl), &len, NULL);
@@ -560,6 +563,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
         }
         // System Time
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_SYSTEM_TIME, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find sys time tag");
         if(cbor_value_is_valid(&repVal))
         {
             err = cbor_value_dup_text_string(&repVal, &(info.systemTime), &len, NULL);
@@ -568,6 +572,8 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
 
         // Resource type
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_RESOURCE_TYPE, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find resource type tag");
+
         if(cbor_value_is_valid(&repVal))
         {
             err = cbor_value_dup_text_string(&repVal, &rt, &len, NULL);
@@ -576,6 +582,8 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
 
         // Interface Types
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_INTERFACE, &repVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find interface tag");
+
         if(cbor_value_is_valid(&repVal))
         {
             err =  OCParseStringLL(rootValue, OC_RSRVD_INTERFACE, &interfaces);
@@ -589,9 +597,7 @@ static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *r
        out->rt = rt;
        out->interfaces = interfaces;
        *outPayload = (OCPayload *)out;
-
        OIC_LOG_PAYLOAD(DEBUG, *outPayload);
-
        return OC_STACK_OK;
     }
 
@@ -610,6 +616,7 @@ static OCRepPayloadPropType DecodeCborType(CborType type)
         case CborIntegerType:
             return OCREP_PROP_INT;
         case CborDoubleType:
+        case CborFloatType:
             return OCREP_PROP_DOUBLE;
         case CborBooleanType:
             return OCREP_PROP_BOOL;
@@ -756,7 +763,19 @@ static CborError OCParseArrayFillArray(const CborValue *parent,
                 case OCREP_PROP_DOUBLE:
                     if (dimensions[1] == 0)
                     {
-                        err = cbor_value_get_double(&insideArray, &(((double*)targetArray)[i]));
+                        double *d = &(((double*)targetArray)[i]);
+                        if (cbor_value_get_type(&insideArray) == CborDoubleType)
+                        {
+                            err = cbor_value_get_double(&insideArray, d);
+                        }
+                        else
+                        {
+                            /* must be float */
+                            float f;
+                            err = cbor_value_get_float(&insideArray, &f);
+                            if (!err)
+                                *d = f;
+                        }
                     }
                     else
                     {
@@ -837,8 +856,10 @@ exit:
 static CborError OCParseArray(OCRepPayload *out, const char *name, CborValue *container)
 {
     void *arr = NULL;
+
     OCRepPayloadPropType type = OCREP_PROP_NULL;
     size_t dimensions[MAX_REP_ARRAY_DEPTH] = { 0 };
+
     size_t dimTotal = 0;
     size_t allocSize = 0;
     bool res = true;
@@ -1067,6 +1088,7 @@ static OCStackResult OCParseRepPayload(OCPayload **outPayload, CborValue *root)
     if (cbor_value_is_array(root))
     {
         err = cbor_value_enter_container(root, &rootMap);
+        VERIFY_CBOR_SUCCESS(TAG, err, "Failed entering repMap");
     }
     while (cbor_value_is_valid(&rootMap))
     {
@@ -1085,6 +1107,7 @@ static OCStackResult OCParseRepPayload(OCPayload **outPayload, CborValue *root)
         if (cbor_value_is_map(&rootMap))
         {
             err = cbor_value_map_find_value(&rootMap, OC_RSRVD_HREF, &curVal);
+            VERIFY_CBOR_SUCCESS(TAG, err, "to find href tag");
             if (cbor_value_is_valid(&curVal))
             {
                 size_t len = 0;
@@ -1184,6 +1207,7 @@ static OCStackResult OCParsePresencePayload(OCPayload **outPayload, CborValue *r
 
         // Resource type name
         err = cbor_value_map_find_value(rootValue, OC_RSRVD_RESOURCE_TYPE, &curVal);
+        VERIFY_CBOR_SUCCESS(TAG, err, "to find res type tag");
         if (cbor_value_is_valid(&curVal))
         {
             size_t len = 0;