// 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);
+#endif
static OCStackResult OCParseSecurityPayload(OCPayload **outPayload, const uint8_t *payload, size_t size);
OCStackResult OCParsePayload(OCPayload **outPayload, OCPayloadType payloadType,
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;
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, payload, payloadSize);
break;
- case PAYLOAD_TYPE_RD:
- result = OCRDCborToPayload(&rootValue, outPayload);
- break;
default:
OIC_LOG_V(ERROR, TAG, "ParsePayload Type default: %d", payloadType);
result = OC_STACK_INVALID_PARAM;
return result;
}
-void OCFreeOCStringLL(OCStringLL* ll);
-
static OCStackResult OCParseSecurityPayload(OCPayload** outPayload, const uint8_t *payload,
size_t size)
{
while (curPtr)
{
char *trimmed = InPlaceStringTrim(curPtr);
- if (trimmed[0] !='\0')
+ if (trimmed && strlen(trimmed) > 0)
{
if (!OCResourcePayloadAddStringLL(resource, trimmed))
{
{
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;
{
// 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;
- if (!cbor_value_is_map(&rootMap))
+ while (cbor_value_is_map(&rootMap))
{
- OIC_LOG(ERROR, TAG, "Malformed packet!!");
- goto exit;
- }
- 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))
+ 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))
{
- err = cbor_value_dup_byte_string(&curVal, (uint8_t **)&(out->sid), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to copy device id value");
+ 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");
+ }
}
- else if (cbor_value_is_text_string(&curVal))
+
+ // 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, &(out->sid), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to copy device id value");
+ err = cbor_value_dup_text_string(&curVal, &(temp->baseURI), &len, NULL);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find base uri value");
}
- }
- // 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_valid(&curVal))
- {
- err = cbor_value_dup_text_string(&curVal, &(out->baseURI), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find base uri value");
- }
-
- // HREF - Not a mandatory field
- err = cbor_value_map_find_value(&rootMap, OC_RSRVD_HREF, &curVal);
- if (cbor_value_is_valid(&curVal))
- {
- err = cbor_value_dup_text_string(&curVal, &(out->uri), &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find uri value");
- }
+ // 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");
+ }
- // 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, &out->type);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find base uri value");
- }
+ // 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");
+ }
- // 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, &out->iface);
- }
- if (!out->iface)
- {
- if (!OCResourcePayloadAddStringLL(&out->iface, OC_RSRVD_INTERFACE_LL))
+ // 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 = CborErrorOutOfMemory;
+ err = cbor_value_dup_text_string(&curVal, &temp->name, &len, NULL);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find device name");
}
- }
- // Name - Not a mandatory field
- err = cbor_value_map_find_value(&rootMap, OC_RSRVD_DEVICE_NAME, &curVal);
- if (cbor_value_is_valid(&curVal))
- {
- err = cbor_value_dup_text_string(&curVal, &out->name, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find device name");
- }
+ // 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");
- // 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");
+ // 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");
- // 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");
+ while (cbor_value_is_map(&resourceMap))
+ {
+ int bitmap;
- while (cbor_value_is_map(&resourceMap))
- {
- resource = (OCResourcePayload *)OICCalloc(1, sizeof(OCResourcePayload));
- VERIFY_PARAM_NON_NULL(TAG, resource, "Failed allocating resource payload");
+ resource = (OCResourcePayload *)OICCalloc(1, sizeof(OCResourcePayload));
+ VERIFY_PARAM_NON_NULL(TAG, resource, "Failed allocating resource payload");
- // 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");
+ // 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");
- // ResourceTypes
- err = OCParseStringLL(&resourceMap, OC_RSRVD_RESOURCE_TYPE, &resource->types);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find resource type tag/value");
+ // ResourceTypes
+ err = OCParseStringLL(&resourceMap, OC_RSRVD_RESOURCE_TYPE, &resource->types);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find resource type tag/value");
- // Interface Types
- err = OCParseStringLL(&resourceMap, OC_RSRVD_INTERFACE, &resource->interfaces);
- if (CborNoError != err)
- {
- if (!OCResourcePayloadAddStringLL(&resource->interfaces, OC_RSRVD_INTERFACE_LL))
+ // Interface Types
+ err = OCParseStringLL(&resourceMap, OC_RSRVD_INTERFACE, &resource->interfaces);
+ if (CborNoError != err)
{
- OIC_LOG(ERROR, TAG, "Failed to add string to StringLL");
- goto exit;
+ if (!OCResourcePayloadAddStringLL(&resource->interfaces, OC_RSRVD_INTERFACE_LL))
+ {
+ OIC_LOG(ERROR, TAG, "Failed to add string to StringLL");
+ goto exit;
+ }
}
- }
-
- // 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");
+ // 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");
+ }
- // 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_valid(&curVal))
- {
- err = cbor_value_get_boolean(&curVal, &(resource->secure));
- VERIFY_CBOR_SUCCESS(TAG, err, "to find secure value");
- }
+ // 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;
- // 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_valid(&curVal))
- {
- err = cbor_value_get_int(&curVal, (int *)&resource->port);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find port value");
- }
+ err = cbor_value_get_int(&curVal, &port);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find port value");
+ resource->port = (uint16_t)port;
+ }
#ifdef TCP_ADAPTER
- // TCP Port
- err = cbor_value_map_find_value(&policyMap, OC_RSRVD_TCP_PORT, &curVal);
- if (cbor_value_is_valid(&curVal))
- {
- err = cbor_value_get_int(&curVal, (int *)&resource->tcpPort);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find tcp port value");
- }
-#endif
-
- err = cbor_value_advance(&resourceMap);
- VERIFY_CBOR_SUCCESS(TAG, err, "to advance resource map");
-
- OCDiscoveryPayloadAddNewResource(out, resource);
- }
-
- err = cbor_value_leave_container(rootValue, &resourceMap);
- VERIFY_CBOR_SUCCESS(TAG, err, "to advance resource map");
- }
- else
- {
- OIC_LOG(ERROR, TAG, "Malformed packet ");
- goto exit;
- }
-
- *outPayload = (OCPayload *)out;
- OIC_LOG_PAYLOAD(DEBUG, *outPayload);
+ // TCP Port
+ err = cbor_value_map_find_value(&policyMap, OC_RSRVD_TCP_PORT, &curVal);
+ if (cbor_value_is_integer(&curVal))
+ {
+ int tcpPort;
- return OC_STACK_OK;
+ err = cbor_value_get_int(&curVal, &tcpPort);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to find tcp port value");
+ resource->tcpPort = (uint16_t)tcpPort;
+ }
-exit:
- OCDiscoveryResourceDestroy(resource);
- OCDiscoveryPayloadDestroy(out);
- return ret;
-}
+#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;
-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");
+ 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
- *outPayload = NULL;
+ err = cbor_value_advance(&resourceMap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to advance resource map");
- 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;
+ OCDiscoveryPayloadAddNewResource(temp, resource);
+ }
- if (cbor_value_is_map(rootValue))
- {
- 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");
+ err = cbor_value_leave_container(&linkMap, &resourceMap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to leave resource map");
- if (cbor_value_is_valid(&curVal))
- {
- err = OCParseStringLL(rootValue, OC_RSRVD_RESOURCE_TYPE, &out->types);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find rt type tag/value");
- }
+ err = cbor_value_advance(&rootMap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to advance root map");
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_INTERFACE, &curVal);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find interface tag");
- if (cbor_value_is_valid(&curVal))
- {
- err = OCParseStringLL(rootValue, OC_RSRVD_INTERFACE, &out->interfaces);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find interfaces tag/value");
- }
- // 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))
+ if(rootPayload == NULL)
{
- err = cbor_value_dup_byte_string(&curVal, (uint8_t **)&out->sid, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find device id in device payload");
+ rootPayload = temp;
+ curPayload = temp;
}
- else if (cbor_value_is_text_string(&curVal))
+ else
{
- err = cbor_value_dup_text_string(&curVal, &out->sid, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find device id in device payload");
+ curPayload->next = temp;
+ curPayload = curPayload->next;
}
}
- // 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);
- 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);
- 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);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find spec version in device payload");
- }
- // Data Model Versions
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_DATA_MODEL_VERSION, &curVal);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find data model versions tag");
- if (cbor_value_is_valid(&curVal))
- {
- size_t len = 0;
- char * str = NULL;
- err = cbor_value_dup_text_string(&curVal, &str, &len, NULL);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find data model versions in device payload");
- out->dataModelVersions = OCCreateOCStringLL(str);
- OICFree(str);
- }
- err = cbor_value_advance(rootValue);
- VERIFY_CBOR_SUCCESS(TAG, err, "to advance device payload");
- *outPayload = (OCPayload *)out;
- return OC_STACK_OK;
- }
-
-exit:
- OCDevicePayloadDestroy(out);
- return ret;
-}
+ err = cbor_value_leave_container(rootValue, &rootMap);
+ VERIFY_CBOR_SUCCESS(TAG, err, "to leave root map");
-static OCStackResult OCParsePlatformPayload(OCPayload **outPayload, CborValue *rootValue)
-{
- OCStackResult ret = OC_STACK_INVALID_PARAM;
- CborError err = CborNoError;
- OCPlatformInfo info = {0};
- OCStringLL* rt = NULL;
- OCStringLL* interfaces = NULL;
- OCPlatformPayload* out = NULL;
-
- VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid Parameter outPayload");
-
- if (cbor_value_is_map(rootValue))
+ }
+ else
{
- CborValue repVal;
- size_t len = 0;
- ret = OC_STACK_MALFORMED_RESPONSE;
-
- // 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- 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);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find systemTume in the platform payload");
- }
-
- // 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 = OCParseStringLL(rootValue, OC_RSRVD_RESOURCE_TYPE, &rt);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find resource type in the platform payload");
- }
-
- // Interface Types
- err = cbor_value_map_find_value(rootValue, OC_RSRVD_INTERFACE, &repVal);
- VERIFY_CBOR_SUCCESS(TAG, err, "to find interface tag");
+ OIC_LOG(ERROR, TAG, "Malformed packet ");
+ goto exit;
+ }
- if(cbor_value_is_valid(&repVal))
- {
- err = OCParseStringLL(rootValue, OC_RSRVD_INTERFACE, &interfaces);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find interfaces tag/value");
- }
+ *outPayload = (OCPayload *)rootPayload;
+ OIC_LOG_PAYLOAD(DEBUG, *outPayload);
- err = cbor_value_advance(rootValue);
- VERIFY_CBOR_SUCCESS(TAG, err, "Failed to find supportUrl in the platform payload");
-
- out = (OCPlatformPayload *)OCPlatformPayloadCreateAsOwner(&info);
- out->rt = rt;
- out->interfaces = interfaces;
- *outPayload = (OCPayload *)out;
- OIC_LOG_PAYLOAD(DEBUG, *outPayload);
- return OC_STACK_OK;
- }
+ return OC_STACK_OK;
exit:
- OCPlatformInfoDestroy(&info);
- OIC_LOG(ERROR, TAG, "CBOR error In ParsePlatformPayload");
+ OCDiscoveryResourceDestroy(resource);
+ OCDiscoveryPayloadDestroy(rootPayload);
return ret;
}
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;
}
}
{
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))
+ if (cbor_value_is_text_string(&curVal))
{
size_t len = 0;
err = cbor_value_dup_text_string(&curVal, &temp->uri, &len, NULL);
return ret;
}
+#ifdef WITH_PRESENCE
static OCStackResult OCParsePresencePayload(OCPayload **outPayload, CborValue *rootValue)
{
OCStackResult ret = OC_STACK_INVALID_PARAM;
{
CborValue curVal;
uint64_t temp = 0;
+ uint8_t trigger;
// Sequence Number
CborError err = cbor_value_map_find_value(rootValue, OC_RSRVD_NONCE, &curVal);
// 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);
VERIFY_CBOR_SUCCESS(TAG, err, "to find res type tag");
- if (cbor_value_is_valid(&curVal))
+ 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