X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsrc%2Focpayloadparse.c;fp=resource%2Fcsdk%2Fstack%2Fsrc%2Focpayloadparse.c;h=637376715bed81fc67d8b486b01f0dbe565cc506;hb=442026128ead8780fa45d0db8a6f17be7c9220e0;hp=f577a1768eb08816b5b4f1a4934eb221b01f4989;hpb=8aced631b823fd0f8ba48a6ffa8145b9ab5013c0;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/src/ocpayloadparse.c b/resource/csdk/stack/src/ocpayloadparse.c index f577a17..6373767 100755 --- a/resource/csdk/stack/src/ocpayloadparse.c +++ b/resource/csdk/stack/src/ocpayloadparse.c @@ -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;