X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsrc%2Focpayloadparse.c;h=59c4c62221dccd1626c70827c5ca2ed88c78ca17;hb=1e743d337b66bda0e44a5ca500d4d7178bb599b5;hp=ea2d484fb02adf1daf2273bf6cf66ad3a23be604;hpb=00380c6e4145bf0f084b235bc153c9617093efe5;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/src/ocpayloadparse.c b/resource/csdk/stack/src/ocpayloadparse.c index ea2d484..59c4c62 100755 --- a/resource/csdk/stack/src/ocpayloadparse.c +++ b/resource/csdk/stack/src/ocpayloadparse.c @@ -26,6 +26,7 @@ // Refer http://pubs.opengroup.org/onlinepubs/009695399/ // Required for strok_r #define _POSIX_C_SOURCE 200112L + #include #include #include "oic_string.h" @@ -34,16 +35,16 @@ #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, @@ -57,7 +58,6 @@ 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; @@ -70,24 +70,17 @@ OCStackResult OCParsePayload(OCPayload **outPayload, OCPayloadType payloadType, 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; @@ -100,8 +93,6 @@ exit: return result; } -void OCFreeOCStringLL(OCStringLL* ll); - static OCStackResult OCParseSecurityPayload(OCPayload** outPayload, const uint8_t *payload, size_t size) { @@ -158,7 +149,7 @@ static CborError OCParseStringLL(CborValue *map, char *type, OCStringLL **resour while (curPtr) { char *trimmed = InPlaceStringTrim(curPtr); - if (trimmed[0] !='\0') + if (trimmed && strlen(trimmed) > 0) { if (!OCResourcePayloadAddStringLL(resource, trimmed)) { @@ -184,7 +175,9 @@ static OCStackResult OCParseDiscoveryPayload(OCPayload **outPayload, CborValue * { 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; @@ -195,419 +188,208 @@ static OCStackResult OCParseDiscoveryPayload(OCPayload **outPayload, CborValue * { // 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->interface); - } - if (!out->interface) - { - if (!OCResourcePayloadAddStringLL(&out->interface, 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; } @@ -875,8 +657,7 @@ static CborError OCParseArray(OCRepPayload *out, const char *name, CborValue *co 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; } @@ -983,6 +764,7 @@ static CborError OCParseSingleRepPayload(OCRepPayload **outPayload, CborValue *o { err = cbor_value_advance(&repMap); OICFree(name); + name = NULL; continue; } } @@ -1112,7 +894,7 @@ static OCStackResult OCParseRepPayload(OCPayload **outPayload, CborValue *root) { 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); @@ -1173,6 +955,7 @@ exit: return ret; } +#ifdef WITH_PRESENCE static OCStackResult OCParsePresencePayload(OCPayload **outPayload, CborValue *rootValue) { OCStackResult ret = OC_STACK_INVALID_PARAM; @@ -1190,29 +973,35 @@ static OCStackResult OCParsePresencePayload(OCPayload **outPayload, CborValue *r 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); 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); @@ -1230,3 +1019,4 @@ exit: OCPresencePayloadDestroy(payload); return ret; } +#endif // WITH_PRESENCE