// Refer http://pubs.opengroup.org/onlinepubs/009695399/
// Required for strok_r
#define _POSIX_C_SOURCE 200112L
+
#include <string.h>
#include <stdlib.h>
#include "oic_string.h"
#include "ocpayloadcbor.h"
#include "ocstackinternal.h"
#include "payload_logging.h"
-#include "rdpayload.h"
+#include "platform_features.h"
#define TAG "OIC_RI_PAYLOADPARSE"
static OCStackResult OCParseDiscoveryPayload(OCPayload **outPayload, CborValue *arrayVal);
-static OCStackResult OCParseDevicePayload(OCPayload **outPayload, CborValue *arrayVal);
-static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *arrayVal);
static CborError OCParseSingleRepPayload(OCRepPayload **outPayload, CborValue *repParent, bool isRoot);
static OCStackResult OCParseRepPayload(OCPayload **outPayload, CborValue *arrayVal);
+#ifdef WITH_PRESENCE
static OCStackResult OCParsePresencePayload(OCPayload **outPayload, CborValue *arrayVal);
-static OCStackResult OCParseSecurityPayload(OCPayload **outPayload, CborValue * rrayVal);
+#endif
+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)
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);
CborParser parser;
CborValue rootValue;
case PAYLOAD_TYPE_DISCOVERY:
result = OCParseDiscoveryPayload(outPayload, &rootValue);
break;
- case PAYLOAD_TYPE_DEVICE:
- result = OCParseDevicePayload(outPayload, &rootValue);
- break;
- case PAYLOAD_TYPE_PLATFORM:
- result = OCParsePlatformPayload(outPayload, &rootValue);
- break;
case PAYLOAD_TYPE_REPRESENTATION:
result = OCParseRepPayload(outPayload, &rootValue);
break;
+#ifdef WITH_PRESENCE
case PAYLOAD_TYPE_PRESENCE:
result = OCParsePresencePayload(outPayload, &rootValue);
break;
+#endif
case PAYLOAD_TYPE_SECURITY:
- result = OCParseSecurityPayload(outPayload, &rootValue);
- break;
- case PAYLOAD_TYPE_RD:
- result = OCRDCborToPayload(&rootValue, outPayload);
+ result = OCParseSecurityPayload(outPayload, payload, payloadSize);
break;
default:
OIC_LOG_V(ERROR, TAG, "ParsePayload Type default: %d", payloadType);
return result;
}
-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)
CborError err = cbor_value_map_find_value(map, type, &val);
VERIFY_CBOR_SUCCESS(TAG, err, "to find StringLL TAG");
- if (cbor_value_is_text_string(&val))
+ if (cbor_value_is_array(&val))
{
- char *input = NULL;
- char *savePtr = NULL;
- size_t len = 0;
-
- err = cbor_value_dup_text_string(&val, &input, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find StringLL value");
-
- if (input)
+ CborValue txtStr;
+ err = cbor_value_enter_container(&val, &txtStr);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to enter container");
+ while (cbor_value_is_text_string(&txtStr))
{
- char *curPtr = strtok_r(input, " ", &savePtr);
- while (curPtr)
+ size_t len = 0;
+ char *input = NULL;
+ err = cbor_value_dup_text_string(&txtStr, &input, &len, NULL);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find StringLL value.");
+ if (input)
{
- char *trimmed = InPlaceStringTrim(curPtr);
- if (trimmed[0] !='\0')
+ char *savePtr = NULL;
+ char *curPtr = strtok_r(input, " ", &savePtr);
+ while (curPtr)
{
- if (!OCResourcePayloadAddStringLL(resource, trimmed))
+ char *trimmed = InPlaceStringTrim(curPtr);
+ if (trimmed && strlen(trimmed) > 0)
{
- return CborErrorOutOfMemory;
+ if (!OCResourcePayloadAddStringLL(resource, trimmed))
+ {
+ return CborErrorOutOfMemory;
+ }
}
+ curPtr = strtok_r(NULL, " ", &savePtr);
}
- curPtr = strtok_r(NULL, " ", &savePtr);
+ OICFree(input);
+ }
+ if (cbor_value_is_text_string(&txtStr))
+ {
+ err = cbor_value_advance(&txtStr);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to advance string value");
}
- OICFree(input);
}
}
exit:
{
OCStackResult ret = OC_STACK_INVALID_PARAM;
OCResourcePayload *resource = NULL;
- OCDiscoveryPayload *out = NULL;
+ OCDiscoveryPayload *temp = NULL;
+ OCDiscoveryPayload *rootPayload = NULL;
+ OCDiscoveryPayload *curPayload = NULL;
size_t len = 0;
CborError err = CborNoError;
*outPayload = NULL;
VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid Parameter outPayload");
VERIFY_PARAM_NON_NULL(TAG, rootValue, "Invalid Parameter rootValue");
-
- // Root value is already inside the main root array
- CborValue rootMap;
- ret = OC_STACK_NO_MEMORY;
- out = OCDiscoveryPayloadCreate();
- VERIFY_PARAM_NON_NULL(TAG, out, "Failed error initializing discovery payload");
-
- // Enter the main root map
- ret = OC_STACK_MALFORMED_RESPONSE;
- err = cbor_value_enter_container(rootValue, &rootMap);
- VERIFY_CBOR_SUCCESS(TAG, err, "to enter root map container");
-
- // Look for DI
- CborValue curVal;
- err = cbor_value_map_find_value(&rootMap, OC_RSRVD_DEVICE_ID, &curVal);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find device id tag");
+ if (cbor_value_is_array(rootValue))
{
- err = cbor_value_dup_byte_string(&curVal, &(out->sid), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to copy device id value");
- }
+ // Root value is already inside the main root array
+ CborValue rootMap;
- // BaseURI - Not a mandatory field
- err = cbor_value_map_find_value(&rootMap, OC_RSRVD_BASE_URI, &curVal);
- if (cbor_value_is_valid(&curVal))
- {
- err = cbor_value_dup_text_string(&curVal, &(out->baseURI), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find base uri value");
- }
+ // Enter the main root map
+ ret = OC_STACK_MALFORMED_RESPONSE;
+ err = cbor_value_enter_container(rootValue, &rootMap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to enter root map container");
+ while (cbor_value_is_map(&rootMap))
+ {
+ ret = OC_STACK_NO_MEMORY;
+ temp = OCDiscoveryPayloadCreate();
+ VERIFY_PARAM_NON_NULL(TAG, temp, "Failed error initializing discovery payload");
+
+ // Look for DI
+ CborValue curVal;
+ err = cbor_value_map_find_value(&rootMap, 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))
+ {
+ err = cbor_value_dup_byte_string(&curVal, (uint8_t **)&(temp->sid), &len, NULL);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to copy device id value");
+ }
+ else if (cbor_value_is_text_string(&curVal))
+ {
+ err = cbor_value_dup_text_string(&curVal, &(temp->sid), &len, NULL);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to copy device id value");
+ }
+ }
- // Look for Links which will have an array as the value
- CborValue linkMap;
- err = cbor_value_map_find_value(&rootMap, OC_RSRVD_LINKS, &linkMap);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find links tag");
+ // BaseURI - Not a mandatory field
+ err = cbor_value_map_find_value(&rootMap, OC_RSRVD_BASE_URI, &curVal);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find uri tag");
+ if (cbor_value_is_text_string(&curVal))
+ {
+ err = cbor_value_dup_text_string(&curVal, &(temp->baseURI), &len, NULL);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find base uri value");
+ }
- // Enter the links array and start iterating through the array processing
- // each resource which shows up as a map.
- CborValue resourceMap;
- err = cbor_value_enter_container(&linkMap, &resourceMap);
- VERIFY_CBOR_SUCCESS(TAG, err, "to enter link map");
+ // RT - Not a mandatory field
+ err = cbor_value_map_find_value(&rootMap, OC_RSRVD_RESOURCE_TYPE, &curVal);
+ if (cbor_value_is_valid(&curVal))
+ {
+ err = OCParseStringLL(&rootMap, OC_RSRVD_RESOURCE_TYPE, &temp->type);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find resource type");
+ }
- while (cbor_value_is_map(&resourceMap))
- {
- resource = (OCResourcePayload *)OICCalloc(1, sizeof(OCResourcePayload));
- VERIFY_PARAM_NON_NULL(TAG, resource, "Failed allocating resource payload");
+ // IF - Not a mandatory field
+ err = cbor_value_map_find_value(&rootMap, OC_RSRVD_INTERFACE, &curVal);
+ if (cbor_value_is_valid(&curVal))
+ {
+ err = OCParseStringLL(&rootMap, OC_RSRVD_INTERFACE, &temp->iface);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find interface");
+ }
- // Uri
- err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_HREF, &curVal);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find href tag");
- err = cbor_value_dup_text_string(&curVal, &(resource->uri), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find href value");
+ // Name - Not a mandatory field
+ err = cbor_value_map_find_value(&rootMap, OC_RSRVD_DEVICE_NAME, &curVal);
+ if (cbor_value_is_text_string(&curVal))
+ {
+ err = cbor_value_dup_text_string(&curVal, &temp->name, &len, NULL);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find device name");
+ }
- // ResourceTypes
- err = OCParseStringLL(&resourceMap, OC_RSRVD_RESOURCE_TYPE, &resource->types);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find resource type tag/value");
+ // Look for Links which will have an array as the value
+ CborValue linkMap;
+ err = cbor_value_map_find_value(&rootMap, OC_RSRVD_LINKS, &linkMap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find links tag");
- // Interface Types
- err = OCParseStringLL(&resourceMap, OC_RSRVD_INTERFACE, &resource->interfaces);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find interface tag/value");
-
- // Policy
- CborValue policyMap;
- err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_POLICY, &policyMap);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find policy tag");
-
- // Bitmap
- err = cbor_value_map_find_value(&policyMap, OC_RSRVD_BITMAP, &curVal);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find bitmap tag");
- err = cbor_value_get_int(&curVal, (int *)&resource->bitmap);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find bitmap value");
-
- // Secure Flag
- err = cbor_value_map_find_value(&policyMap, OC_RSRVD_SECURE, &curVal);
- if (cbor_value_is_valid(&curVal))
- {
- err = cbor_value_get_boolean(&curVal, &(resource->secure));
- VERIFY_CBOR_SUCCESS(TAG, err, "to find secure value");
- }
+ // Enter the links array and start iterating through the array processing
+ // each resource which shows up as a map.
+ CborValue resourceMap;
+ err = cbor_value_enter_container(&linkMap, &resourceMap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to enter link map");
- // Port
- err = cbor_value_map_find_value(&policyMap, OC_RSRVD_HOSTING_PORT, &curVal);
- if (cbor_value_is_valid(&curVal))
- {
- err = cbor_value_get_int(&curVal, (int *)&resource->port);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find port value");
- }
+ while (cbor_value_is_map(&resourceMap))
+ {
+ int bitmap;
- err = cbor_value_advance(&resourceMap);
- VERIFY_CBOR_SUCCESS(TAG, err, "to advance resource map");
+ resource = (OCResourcePayload *)OICCalloc(1, sizeof(OCResourcePayload));
+ VERIFY_PARAM_NON_NULL(TAG, resource, "Failed allocating resource payload");
- OCDiscoveryPayloadAddNewResource(out, resource);
- }
+ // Uri
+ err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_HREF, &curVal);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find href tag");
+ err = cbor_value_dup_text_string(&curVal, &(resource->uri), &len, NULL);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find href value");
- err = cbor_value_leave_container(rootValue, &resourceMap);
- VERIFY_CBOR_SUCCESS(TAG, err, "to advance resource map");
+ // ResourceTypes
+ err = OCParseStringLL(&resourceMap, OC_RSRVD_RESOURCE_TYPE, &resource->types);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find resource type tag/value");
- *outPayload = (OCPayload *)out;
- return OC_STACK_OK;
+ // Interface Types
+ err = OCParseStringLL(&resourceMap, OC_RSRVD_INTERFACE, &resource->interfaces);
+ if (CborNoError != err)
+ {
+ if (!OCResourcePayloadAddStringLL(&resource->interfaces, OC_RSRVD_INTERFACE_LL))
+ {
+ OIC_LOG(ERROR, TAG, "Failed to add string to StringLL");
+ goto exit;
+ }
+ }
-exit:
- OCDiscoveryResourceDestroy(resource);
- OCDiscoveryPayloadDestroy(out);
- return ret;
-}
+ // Policy
+ CborValue policyMap;
+ err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_POLICY, &policyMap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find policy tag");
+
+ // Bitmap
+ err = cbor_value_map_find_value(&policyMap, OC_RSRVD_BITMAP, &curVal);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find bitmap tag");
+ err = cbor_value_get_int(&curVal, &bitmap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find bitmap value");
+ resource->bitmap = (uint8_t)bitmap;
+
+ // Secure Flag
+ err = cbor_value_map_find_value(&policyMap, OC_RSRVD_SECURE, &curVal);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find secure tag");
+ if (cbor_value_is_boolean(&curVal))
+ {
+ err = cbor_value_get_boolean(&curVal, &(resource->secure));
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find secure value");
+ }
-static OCStackResult OCParseDevicePayload(OCPayload **outPayload, CborValue *rootValue)
-{
- OCStackResult ret = OC_STACK_INVALID_PARAM;
- CborError err = CborNoError;
- OCDevicePayload *out = NULL;
- VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid param outPayload");
- VERIFY_PARAM_NON_NULL(TAG, rootValue, "Invalid param rootValue");
+ // Port
+ err = cbor_value_map_find_value(&policyMap, OC_RSRVD_HOSTING_PORT, &curVal);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find port tag");
+ if (cbor_value_is_integer(&curVal))
+ {
+ int port;
- *outPayload = NULL;
+ err = cbor_value_get_int(&curVal, &port);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find port value");
+ resource->port = (uint16_t)port;
+ }
- out = (OCDevicePayload *)OICCalloc(1, sizeof(OCDevicePayload));
- VERIFY_PARAM_NON_NULL(TAG, out, "Failed allocating device payload")
- out->base.type = PAYLOAD_TYPE_DEVICE;
- ret = OC_STACK_MALFORMED_RESPONSE;
+#ifdef TCP_ADAPTER
+ // TCP Port
+ err = cbor_value_map_find_value(&policyMap, OC_RSRVD_TCP_PORT, &curVal);
+ if (cbor_value_is_integer(&curVal))
+ {
+ int tcpPort;
- if (cbor_value_is_map(rootValue))
- {
- // Device ID
- size_t len = 0;
- CborValue curVal;
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_DEVICE_ID, &curVal);
- if (cbor_value_is_valid(&curVal))
- {
- err = cbor_value_dup_byte_string(&curVal, &out->sid, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find device id in device payload");
- }
- // Device Name
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_DEVICE_NAME, &curVal);
- if (cbor_value_is_valid(&curVal))
- {
- err = cbor_value_dup_text_string(&curVal, &out->deviceName, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find device name in device payload");
- }
- // Device Spec Version
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_SPEC_VERSION, &curVal);
- if (cbor_value_is_valid(&curVal))
- {
- err = cbor_value_dup_text_string(&curVal, &out->specVersion, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find spec version in device payload");
- }
- // Data Model Version
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_DATA_MODEL_VERSION, &curVal);
- if (cbor_value_is_valid(&curVal))
- {
- err = cbor_value_dup_text_string(&curVal, &out->dataModelVersion, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find data model version in device payload");
- }
- err = cbor_value_advance(rootValue);
- VERIFY_CBOR_SUCCESS(TAG, err, "to advance device payload");
+ err = cbor_value_get_int(&curVal, &tcpPort);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find tcp port value");
+ resource->tcpPort = (uint16_t)tcpPort;
+ }
- *outPayload = (OCPayload *)out;
- return OC_STACK_OK;
- }
+#ifdef __WITH_TLS__
+ // TLS Port
+ err = cbor_value_map_find_value(&policyMap, OC_RSRVD_TLS_PORT, &curVal);
+ if (cbor_value_is_integer(&curVal))
+ {
+ int tlsPort;
-exit:
- OCDevicePayloadDestroy(out);
- return ret;
-}
+ err = cbor_value_get_int(&curVal, &tlsPort);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find tcp tls port value");
+ resource->tcpPort = (uint16_t)tlsPort;
+ }
+#endif
+#endif
-static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *rootValue)
-{
- OCStackResult ret = OC_STACK_INVALID_PARAM;
- CborError err = CborNoError;
- OCPlatformInfo info = {0};
+ err = cbor_value_advance(&resourceMap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to advance resource map");
- VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid Parameter outPayload");
+ OCDiscoveryPayloadAddNewResource(temp, resource);
+ }
- if (cbor_value_is_map(rootValue))
- {
- CborValue repVal;
- size_t len = 0;
- ret = OC_STACK_MALFORMED_RESPONSE;
+ err = cbor_value_leave_container(&linkMap, &resourceMap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to leave resource map");
- // Platform ID
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_PLATFORM_ID, &repVal);
- if (cbor_value_is_valid(&repVal))
- {
- err = cbor_value_dup_text_string(&repVal, &(info.platformID), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find platformID in the platform payload");
- }
- // MFG Name
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_MFG_NAME, &repVal);
- if (cbor_value_is_valid(&repVal))
- {
- err = cbor_value_dup_text_string(&repVal, &(info.manufacturerName), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find manufactureName in the platform payload");
- }
- // MFG URL
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_MFG_URL, &repVal);
- if (cbor_value_is_valid(&repVal))
- {
- err = cbor_value_dup_text_string(&repVal, &(info.manufacturerUrl), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find manufactureUrl in the platform payload");
- }
- // Model Num
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_MODEL_NUM, &repVal);
- if (cbor_value_is_valid(&repVal))
- {
- err = cbor_value_dup_text_string(&repVal, &(info.modelNumber), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find modelNumber in the platform payload");
- }
- // Date of Mfg
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_MFG_DATE, &repVal);
- if (cbor_value_is_valid(&repVal))
- {
- err = cbor_value_dup_text_string(&repVal, &(info.dateOfManufacture), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find dateOfManufacture in the platform payload");
- }
- // Platform Version
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_PLATFORM_VERSION, &repVal);
- if (cbor_value_is_valid(&repVal))
- {
- err = cbor_value_dup_text_string(&repVal, &(info.platformVersion), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find platformVersion in the platform payload");
- }
- // OS Version
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_OS_VERSION, &repVal);
- if (cbor_value_is_valid(&repVal))
- {
- err = cbor_value_dup_text_string(&repVal, &(info.operatingSystemVersion), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find OSVersion in the platform payload");
- }
- // Hardware Version
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_HARDWARE_VERSION, &repVal);
- if(cbor_value_is_valid(&repVal))
- {
- err = cbor_value_dup_text_string(&repVal, &(info.hardwareVersion), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find HWVersion in the platform payload");
- }
- // Firmware Version
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_FIRMWARE_VERSION, &repVal);
- if(cbor_value_is_valid(&repVal))
- {
- err = cbor_value_dup_text_string(&repVal, &(info.firmwareVersion), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find firmwareVersion in the platform payload");
- }
- // Support URL
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_SUPPORT_URL, &repVal);
- if(cbor_value_is_valid(&repVal))
- {
- err = cbor_value_dup_text_string(&repVal, &(info.supportUrl), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find supportUrl in the platform payload");
- }
- // System Time
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_SYSTEM_TIME, &repVal);
- if(cbor_value_is_valid(&repVal))
- {
- err = cbor_value_dup_text_string(&repVal, &(info.systemTime), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find systemTume in the platform payload");
+ err = cbor_value_advance(&rootMap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to advance root map");
+
+ if(rootPayload == NULL)
+ {
+ rootPayload = temp;
+ curPayload = temp;
+ }
+ else
+ {
+ curPayload->next = temp;
+ curPayload = curPayload->next;
+ }
}
- err = cbor_value_advance(rootValue);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find supportUrl in the platform payload");
+ err = cbor_value_leave_container(rootValue, &rootMap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to leave root map");
- *outPayload = (OCPayload *)OCPlatformPayloadCreateAsOwner(&info);
- return OC_STACK_OK;
}
+ else
+ {
+ OIC_LOG(ERROR, TAG, "Malformed packet ");
+ goto exit;
+ }
+
+ *outPayload = (OCPayload *)rootPayload;
+ OIC_LOG_PAYLOAD(DEBUG, *outPayload);
+
+ return OC_STACK_OK;
exit:
- OCPlatformInfoDestroy(&info);
- OIC_LOG(ERROR, TAG, "CBOR error In ParsePlatformPayload");
+ OCDiscoveryResourceDestroy(resource);
+ OCDiscoveryPayloadDestroy(rootPayload);
return ret;
}
case CborIntegerType:
return OCREP_PROP_INT;
case CborDoubleType:
+ case CborFloatType:
return OCREP_PROP_DOUBLE;
case CborBooleanType:
return OCREP_PROP_BOOL;
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
{
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;
res = OCRepPayloadSetNull(out, name);
err = (CborError) !res;
VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting value");
- err = cbor_value_advance(container);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed advancing container");
+ container = container + 1;
return err;
}
{
err = cbor_value_advance(&repMap);
OICFree(name);
+ name = NULL;
continue;
}
}
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))
{
CborValue curVal;
ret = OC_STACK_MALFORMED_RESPONSE;
+ // temporary fix to check for malformed cbor payload
+ if (!cbor_value_is_map(&rootMap) && !cbor_value_is_array(&rootMap)){
+ goto exit;
+ }
+
if (cbor_value_is_map(&rootMap))
{
err = cbor_value_map_find_value(&rootMap, OC_RSRVD_HREF, &curVal);
- if (cbor_value_is_valid(&curVal))
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find href tag");
+ if (cbor_value_is_text_string(&curVal))
{
size_t len = 0;
err = cbor_value_dup_text_string(&curVal, &temp->uri, &len, NULL);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find uri");
}
}
+
// Resource types
if (cbor_value_is_map(&rootMap))
{
err = OCParseSingleRepPayload(&temp, &rootMap, true);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed to parse single rep payload");
}
+
if(rootPayload == NULL)
{
rootPayload = temp;
return ret;
}
+#ifdef WITH_PRESENCE
static OCStackResult OCParsePresencePayload(OCPayload **outPayload, CborValue *rootValue)
{
OCStackResult ret = OC_STACK_INVALID_PARAM;
if (cbor_value_is_map(rootValue))
{
CborValue curVal;
+ uint64_t temp = 0;
+ uint8_t trigger;
// Sequence Number
CborError err = cbor_value_map_find_value(rootValue, OC_RSRVD_NONCE, &curVal);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding nonce tag");
- err = cbor_value_get_uint64(&curVal, (uint64_t *)&payload->sequenceNumber);
+ err = cbor_value_get_uint64(&curVal, &temp);
+ payload->sequenceNumber = (uint32_t)temp;
VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding nonce value");
// Max Age
err = cbor_value_map_find_value(rootValue, OC_RSRVD_TTL, &curVal);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding ttl tag");
- err = cbor_value_get_uint64(&curVal, (uint64_t *)&payload->maxAge);
+ temp = 0;
+ err = cbor_value_get_uint64(&curVal, &temp);
+ payload->maxAge = (uint32_t)temp;
VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding ttl value");
// Trigger
err = cbor_value_map_find_value(rootValue, OC_RSRVD_TRIGGER, &curVal);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding trigger tag");
- err = cbor_value_get_simple_type(&curVal, (uint8_t *)&payload->trigger);
+ err = cbor_value_get_simple_type(&curVal, &trigger);
VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding trigger value");
+ payload->trigger = (OCPresenceTrigger)trigger;
// Resource type name
err = cbor_value_map_find_value(rootValue, OC_RSRVD_RESOURCE_TYPE, &curVal);
- if (cbor_value_is_valid(&curVal))
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find res type tag");
+ if (cbor_value_is_text_string(&curVal))
{
size_t len = 0;
err = cbor_value_dup_text_string(&curVal, &payload->resourceType, &len, NULL);
OCPresencePayloadDestroy(payload);
return ret;
}
+#endif // WITH_PRESENCE