diff options
author | Todd Malsbary <todd.malsbary@intel.com> | 2017-04-18 13:28:21 -0700 |
---|---|---|
committer | Uze Choi <uzchoi@samsung.com> | 2017-04-28 06:00:55 +0000 |
commit | 63c17fd1d63e63f2e05a84a2dd7c114223c8c5fb (patch) | |
tree | a151ed906d88de6b7a7a6e4d3037746704df51d7 /resource/csdk/stack | |
parent | 501edd6270e22a127833d3b275acee5ee22ae9e5 (diff) | |
download | iotivity-63c17fd1d63e63f2e05a84a2dd7c114223c8c5fb.tar.gz iotivity-63c17fd1d63e63f2e05a84a2dd7c114223c8c5fb.tar.bz2 iotivity-63c17fd1d63e63f2e05a84a2dd7c114223c8c5fb.zip |
[IOT-2056] Align baseline /oic/res response with spec.
This only applies to the application/vnd.ocf+cbor content format.
- Response type is array, not object.
- "di" is not part of baseline properties.
Bug: https://jira.iotivity.org/browse/IOT-2056
Change-Id: I27a890509e888e82879afe87801249dc13c1c862
Signed-off-by: Todd Malsbary <todd.malsbary@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/19077
Tested-by: jenkins-iotivity <jenkins@iotivity.org>
Reviewed-by: Phil Coval <philippe.coval@osg.samsung.com>
Reviewed-by: Rick Bell <richard.s.bell@intel.com>
Reviewed-by: Mushfiqul Islam <i.mushfiq@samsung.com>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
Tested-by: Uze Choi <uzchoi@samsung.com>
Diffstat (limited to 'resource/csdk/stack')
-rwxr-xr-x | resource/csdk/stack/src/ocpayloadconvert.c | 20 | ||||
-rwxr-xr-x | resource/csdk/stack/src/ocpayloadparse.c | 389 |
2 files changed, 208 insertions, 201 deletions
diff --git a/resource/csdk/stack/src/ocpayloadconvert.c b/resource/csdk/stack/src/ocpayloadconvert.c index ba0a4fdef..1d261b459 100755 --- a/resource/csdk/stack/src/ocpayloadconvert.c +++ b/resource/csdk/stack/src/ocpayloadconvert.c @@ -494,13 +494,18 @@ static int64_t OCConvertDiscoveryPayloadVndOcfCbor(OCDiscoveryPayload *payload, ] */ + CborEncoder rootArray; CborEncoder rootMap; CborEncoder linkArray; bool isBaseline = payload->name || payload->type || payload->iface; if (isBaseline) { + // Open the root array + err |= cbor_encoder_create_array(&encoder, &rootArray, 1); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating discovery root array"); + // Open the root map - err |= cbor_encoder_create_map(&encoder, &rootMap, CborIndefiniteLength); + err |= cbor_encoder_create_map(&rootArray, &rootMap, CborIndefiniteLength); VERIFY_CBOR_SUCCESS(TAG, err, "Failed creating discovery map"); // Insert Name @@ -508,11 +513,6 @@ static int64_t OCConvertDiscoveryPayloadVndOcfCbor(OCDiscoveryPayload *payload, sizeof(OC_RSRVD_DEVICE_NAME) - 1, payload->name); VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting name"); - // Insert Device ID into the root map - err |= AddTextStringToMap(&rootMap, OC_RSRVD_DEVICE_ID, sizeof(OC_RSRVD_DEVICE_ID) - 1, - payload->sid); - VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting device id"); - // Insert Resource Type err |= OCStringLLJoin(&rootMap, OC_RSRVD_RESOURCE_TYPE, payload->type); VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting RT"); @@ -657,12 +657,16 @@ static int64_t OCConvertDiscoveryPayloadVndOcfCbor(OCDiscoveryPayload *payload, if (isBaseline) { - // Close the final root array. + // Close the link array instead the root map. err |= cbor_encoder_close_container(&rootMap, &linkArray); VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing root array"); // Close root map inside the root array. - err |= cbor_encoder_close_container(&encoder, &rootMap); + err |= cbor_encoder_close_container(&rootArray, &rootMap); + VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing root map"); + + // Close the final root array. + err |= cbor_encoder_close_container(&encoder, &rootArray); VERIFY_CBOR_SUCCESS(TAG, err, "Failed closing root map"); } else diff --git a/resource/csdk/stack/src/ocpayloadparse.c b/resource/csdk/stack/src/ocpayloadparse.c index 68ed73bb9..9fdb003ec 100755 --- a/resource/csdk/stack/src/ocpayloadparse.c +++ b/resource/csdk/stack/src/ocpayloadparse.c @@ -401,243 +401,248 @@ exit: return ret; } -static OCStackResult OCParseDiscoveryPayloadVndOcfCbor(OCPayload **outPayload, CborValue *rootValue) +static CborError ParseResources(OCDiscoveryPayload **outPayload, CborValue *resourceMap) { - OCStackResult ret = OC_STACK_INVALID_PARAM; OCResourcePayload *resource = NULL; - OCDiscoveryPayload *rootPayload = NULL; - OCEndpointPayload *endpoint = NULL; - size_t len = 0; CborError err = CborNoError; - CborValue linkMap; - CborValue *linkArray = NULL; - *outPayload = NULL; + size_t len = 0; + OCEndpointPayload *endpoint = NULL; - VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid Parameter outPayload"); - VERIFY_PARAM_NON_NULL(TAG, rootValue, "Invalid Parameter rootValue"); - if (cbor_value_is_map(rootValue)) + // Iterate through the array processing each resource which shows up as a map. + while (cbor_value_is_map(resourceMap)) { - rootPayload = OCDiscoveryPayloadCreate(); - VERIFY_PARAM_NON_NULL(TAG, rootPayload, "Failed error initializing discovery payload"); + int bitmap; + + resource = (OCResourcePayload *)OICCalloc(1, sizeof(OCResourcePayload)); + VERIFY_PARAM_NON_NULL(TAG, resource, "Failed allocating resource payload"); - // Look for DI + // Uri CborValue curVal; - err = cbor_value_map_find_value(rootValue, OC_RSRVD_DEVICE_ID, &curVal); - VERIFY_CBOR_SUCCESS(TAG, err, "to find device id tag"); + 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"); + + // Rel - Not a mandatory field + err = cbor_value_map_find_value(resourceMap, OC_RSRVD_REL, &curVal); + VERIFY_CBOR_SUCCESS(TAG, err, "to find rel tag"); if (cbor_value_is_valid(&curVal)) { - if (cbor_value_is_byte_string(&curVal)) - { - err = cbor_value_dup_byte_string(&curVal, (uint8_t **)&(rootPayload->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, &(rootPayload->sid), &len, NULL); - VERIFY_CBOR_SUCCESS(TAG, err, "to copy device id value"); - } + err = cbor_value_dup_text_string(&curVal, &(resource->rel), &len, NULL); + VERIFY_CBOR_SUCCESS(TAG, err, "to find rel value"); } - // RT - Not a mandatory field - err = cbor_value_map_find_value(rootValue, OC_RSRVD_RESOURCE_TYPE, &curVal); - if (cbor_value_is_valid(&curVal)) + // Anchor - Not a mandatory field + err = cbor_value_map_find_value(resourceMap, OC_RSRVD_URI, &curVal); + VERIFY_CBOR_SUCCESS(TAG, err, "to find anchor tag"); + if (cbor_value_is_text_string(&curVal)) { - err = OCParseStringLL(rootValue, OC_RSRVD_RESOURCE_TYPE, &rootPayload->type); - VERIFY_CBOR_SUCCESS(TAG, err, "to find resource type"); + err = cbor_value_dup_text_string(&curVal, &(resource->anchor), &len, NULL); + VERIFY_CBOR_SUCCESS(TAG, err, "to find anchor value"); } - // IF - Not a mandatory field - err = cbor_value_map_find_value(rootValue, OC_RSRVD_INTERFACE, &curVal); - if (cbor_value_is_valid(&curVal)) - { - err = OCParseStringLL(rootValue, OC_RSRVD_INTERFACE, &rootPayload->iface); - VERIFY_CBOR_SUCCESS(TAG, err, "to find interface"); - } + // Resource Types + err = OCParseStringLL(resourceMap, OC_RSRVD_RESOURCE_TYPE, &resource->types); + VERIFY_CBOR_SUCCESS(TAG, err, "to find resource type tag/value"); - // Name - Not a mandatory field - err = cbor_value_map_find_value(rootValue, OC_RSRVD_DEVICE_NAME, &curVal); - if (cbor_value_is_text_string(&curVal)) + // Interface Types + err = OCParseStringLL(resourceMap, OC_RSRVD_INTERFACE, &resource->interfaces); + if (CborNoError != err) { - err = cbor_value_dup_text_string(&curVal, &rootPayload->name, &len, NULL); - VERIFY_CBOR_SUCCESS(TAG, err, "to find device name"); + if (!OCResourcePayloadAddStringLL(&resource->interfaces, OC_RSRVD_INTERFACE_LL)) + { + OIC_LOG(ERROR, TAG, "Failed to add string to StringLL"); + goto exit; + } } - // Look for Links which will have an array as the value - err = cbor_value_map_find_value(rootValue, OC_RSRVD_LINKS, &linkMap); - VERIFY_CBOR_SUCCESS(TAG, err, "to find links tag"); - linkArray = &linkMap; - } - else - { - linkArray = rootValue; - } + // Policy + CborValue policyMap; + err = cbor_value_map_find_value(resourceMap, OC_RSRVD_POLICY, &policyMap); + VERIFY_CBOR_SUCCESS(TAG, err, "to find policy tag"); - if (cbor_value_is_array(linkArray)) - { - // Root value is already inside the main root array + // 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; - // Enter the main root array and start iterating through the array processing - // each resource which shows up as a map. - CborValue resourceMap; - err = cbor_value_enter_container(linkArray, &resourceMap); - VERIFY_CBOR_SUCCESS(TAG, err, "to enter root array"); + // Endpoints + CborValue epsMap; + err = cbor_value_map_find_value(resourceMap, OC_RSRVD_ENDPOINTS, &epsMap); + VERIFY_CBOR_SUCCESS(TAG, err, "to find eps tag"); - while (cbor_value_is_map(&resourceMap)) + if (cbor_value_is_array(&epsMap)) { - int bitmap; - - resource = (OCResourcePayload *)OICCalloc(1, sizeof(OCResourcePayload)); - VERIFY_PARAM_NON_NULL(TAG, resource, "Failed allocating resource payload"); - - // Uri - CborValue curVal; - 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"); + CborValue epMap; + err = cbor_value_enter_container(&epsMap, &epMap); + VERIFY_CBOR_SUCCESS(TAG, err, "to enter endpoint map"); - // Rel - Not a mandatory field - err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_REL, &curVal); - VERIFY_CBOR_SUCCESS(TAG, err, "to find rel tag"); - if (cbor_value_is_valid(&curVal)) + while (cbor_value_is_map(&epMap)) { - err = cbor_value_dup_text_string(&curVal, &(resource->rel), &len, NULL); - VERIFY_CBOR_SUCCESS(TAG, err, "to find rel value"); - } + endpoint = NULL; + int pri = 0; + char *endpointStr = NULL; + endpoint = (OCEndpointPayload *)OICCalloc(1, sizeof(OCEndpointPayload)); + VERIFY_PARAM_NON_NULL(TAG, endpoint, "Failed allocating endpoint payload"); + + // ep + err = cbor_value_map_find_value(&epMap, OC_RSRVD_ENDPOINT, &curVal); + VERIFY_CBOR_SUCCESS(TAG, err, "to find endpoint tag"); + err = cbor_value_dup_text_string(&curVal, &endpointStr, &len, NULL); + VERIFY_CBOR_SUCCESS(TAG, err, "to find endpoint value"); + + OCStackResult parseResult = OCParseEndpointString(endpointStr, endpoint); + OICFree(endpointStr); + + if (OC_STACK_OK == parseResult) + { + // pri + err = cbor_value_map_find_value(&epMap, OC_RSRVD_PRIORITY, &curVal); + VERIFY_CBOR_SUCCESS(TAG, err, "to find priority tag"); + err = cbor_value_get_int(&curVal, &pri); + VERIFY_CBOR_SUCCESS(TAG, err, "to find priority value"); + endpoint->pri = (uint16_t)pri; + OCResourcePayloadAddNewEndpoint(resource, endpoint); + endpoint = NULL; + } + else + { + if (OC_STACK_ADAPTER_NOT_ENABLED == parseResult) + { + OIC_LOG(ERROR, TAG, "Ignore unrecognized endpoint info"); + } + // destroy endpoint + OCDiscoveryEndpointDestroy(endpoint); + endpoint = NULL; + } - // Anchor - Not a mandatory field - err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_URI, &curVal); - VERIFY_CBOR_SUCCESS(TAG, err, "to find anchor tag"); - if (cbor_value_is_text_string(&curVal)) - { - err = cbor_value_dup_text_string(&curVal, &(resource->anchor), &len, NULL); - VERIFY_CBOR_SUCCESS(TAG, err, "to find anchor value"); + err = cbor_value_advance(&epMap); + VERIFY_CBOR_SUCCESS(TAG, err, "to advance endpoint map"); } - // Resource Types - err = OCParseStringLL(&resourceMap, OC_RSRVD_RESOURCE_TYPE, &resource->types); - VERIFY_CBOR_SUCCESS(TAG, err, "to find resource type tag/value"); + err = cbor_value_leave_container(&epsMap, &epMap); + VERIFY_CBOR_SUCCESS(TAG, err, "to leave eps map"); + } + + err = cbor_value_advance(resourceMap); + VERIFY_CBOR_SUCCESS(TAG, err, "to advance resource map"); - // Interface Types - err = OCParseStringLL(&resourceMap, OC_RSRVD_INTERFACE, &resource->interfaces); - if (CborNoError != err) + // Parse di from anchor + if (!resource->anchor || strncmp(resource->anchor, "ocf://", 6)) + { + OIC_LOG_V(ERROR, TAG, "Ignore unrecognized anchor %s", resource->anchor); + OCDiscoveryResourceDestroy(resource); + } + else + { + char *di = OICStrdup(resource->anchor + 6); + char *slash = strchr(di, '/'); + if (slash) + { + *slash = '\0'; + } + OCDiscoveryPayload **temp = outPayload; + while (*temp) { - if (!OCResourcePayloadAddStringLL(&resource->interfaces, OC_RSRVD_INTERFACE_LL)) + if (!(*temp)->sid) { - OIC_LOG(ERROR, TAG, "Failed to add string to StringLL"); - goto exit; + (*temp)->sid = di; + OCDiscoveryPayloadAddNewResource(*temp, resource); + break; + } + else if (!strcmp((*temp)->sid, di)) + { + OCDiscoveryPayloadAddNewResource(*temp, resource); + OICFree(di); + break; } + temp = &(*temp)->next; + } + if (!*temp) + { + *temp = OCDiscoveryPayloadCreate(); + VERIFY_PARAM_NON_NULL(TAG, *temp, "Failed error initializing discovery payload"); + (*temp)->sid = di; + OCDiscoveryPayloadAddNewResource(*temp, resource); } + } + } +exit: + if (CborNoError != err) + { + OCDiscoveryResourceDestroy(resource); + OCDiscoveryEndpointDestroy(endpoint); + } + return err; +} - // Policy - CborValue policyMap; - err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_POLICY, &policyMap); - VERIFY_CBOR_SUCCESS(TAG, err, "to find policy tag"); +static OCStackResult OCParseDiscoveryPayloadVndOcfCbor(OCPayload **outPayload, CborValue *rootValue) +{ + OCStackResult ret = OC_STACK_INVALID_PARAM; + OCDiscoveryPayload *rootPayload = NULL; + CborError err = CborNoError; + size_t len = 0; + *outPayload = NULL; - // 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; + VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid Parameter outPayload"); + VERIFY_PARAM_NON_NULL(TAG, rootValue, "Invalid Parameter rootValue"); + if (cbor_value_is_array(rootValue)) + { + // Root value is already inside the main root array - // Endpoints - CborValue epsMap; - err = cbor_value_map_find_value(&resourceMap, OC_RSRVD_ENDPOINTS, &epsMap); - VERIFY_CBOR_SUCCESS(TAG, err, "to find eps tag"); + CborValue rootMap; + err = cbor_value_enter_container(rootValue, &rootMap); + VERIFY_CBOR_SUCCESS(TAG, err, "to enter root array"); - if (cbor_value_is_array(&epsMap)) - { - CborValue epMap; - err = cbor_value_enter_container(&epsMap, &epMap); - VERIFY_CBOR_SUCCESS(TAG, err, "to enter endpoint map"); + // Look for Links which will have an array as the value + CborValue linkVal; + err = cbor_value_map_find_value(&rootMap, OC_RSRVD_LINKS, &linkVal); + VERIFY_CBOR_SUCCESS(TAG, err, "to find links tag"); + if (cbor_value_is_array(&linkVal)) + { + rootPayload = OCDiscoveryPayloadCreate(); + VERIFY_PARAM_NON_NULL(TAG, rootPayload, "Failed error initializing discovery payload"); - while (cbor_value_is_map(&epMap)) - { - endpoint = NULL; - int pri = 0; - char *endpointStr = NULL; - endpoint = (OCEndpointPayload *)OICCalloc(1, sizeof(OCEndpointPayload)); - VERIFY_PARAM_NON_NULL(TAG, endpoint, "Failed allocating endpoint payload"); + // RT + err = OCParseStringLL(&rootMap, OC_RSRVD_RESOURCE_TYPE, &rootPayload->type); + VERIFY_CBOR_SUCCESS(TAG, err, "to find resource type"); - // ep - err = cbor_value_map_find_value(&epMap, OC_RSRVD_ENDPOINT, &curVal); - VERIFY_CBOR_SUCCESS(TAG, err, "to find endpoint tag"); - err = cbor_value_dup_text_string(&curVal, &endpointStr, &len, NULL); - VERIFY_CBOR_SUCCESS(TAG, err, "to find endpoint value"); + // IF + err = OCParseStringLL(&rootMap, OC_RSRVD_INTERFACE, &rootPayload->iface); + VERIFY_CBOR_SUCCESS(TAG, err, "to find interface"); - OCStackResult parseResult = OCParseEndpointString(endpointStr, endpoint); - OICFree(endpointStr); + // Name - Not a mandatory field + CborValue curVal; + 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, &rootPayload->name, &len, NULL); + VERIFY_CBOR_SUCCESS(TAG, err, "to find device name"); + } - if (OC_STACK_OK == parseResult) - { - // pri - err = cbor_value_map_find_value(&epMap, OC_RSRVD_PRIORITY, &curVal); - VERIFY_CBOR_SUCCESS(TAG, err, "to find priority tag"); - err = cbor_value_get_int(&curVal, &pri); - VERIFY_CBOR_SUCCESS(TAG, err, "to find priority value"); - endpoint->pri = (uint16_t)pri; - OCResourcePayloadAddNewEndpoint(resource, endpoint); - endpoint = NULL; - } - else - { - if (OC_STACK_ADAPTER_NOT_ENABLED == parseResult) - { - OIC_LOG(ERROR, TAG, "Ignore unrecognized endpoint info"); - } - // destroy endpoint - OCDiscoveryEndpointDestroy(endpoint); - endpoint = NULL; - } + // Links + CborValue linkMap; + err = cbor_value_enter_container(&linkVal, &linkMap); + VERIFY_CBOR_SUCCESS(TAG, err, "to enter resource map"); - err = cbor_value_advance(&epMap); - VERIFY_CBOR_SUCCESS(TAG, err, "to advance endpoint map"); - } + err = ParseResources(&rootPayload, &linkMap); + VERIFY_CBOR_SUCCESS(TAG, err, "to parse resources"); - err = cbor_value_leave_container(&epsMap, &epMap); - VERIFY_CBOR_SUCCESS(TAG, err, "to leave eps map"); - } + err = cbor_value_leave_container(&linkVal, &linkMap); + VERIFY_CBOR_SUCCESS(TAG, err, "to leave resource map"); - err = cbor_value_advance(&resourceMap); + err = cbor_value_advance(&rootMap); VERIFY_CBOR_SUCCESS(TAG, err, "to advance resource map"); - - // Parse di from anchor - if (!resource->anchor || strncmp(resource->anchor, "ocf://", 6)) - { - OIC_LOG_V(ERROR, TAG, "Ignore unrecognized anchor %s", resource->anchor); - OCDiscoveryResourceDestroy(resource); - } - else - { - char *di = OICStrdup(resource->anchor + 6); - char *slash = strchr(di, '/'); - if (slash) - { - *slash = '\0'; - } - OCDiscoveryPayload **temp = &rootPayload; - while (*temp) - { - if (!strcmp((*temp)->sid, di)) - { - OCDiscoveryPayloadAddNewResource(*temp, resource); - OICFree(di); - break; - } - temp = &(*temp)->next; - } - if (!*temp) - { - *temp = OCDiscoveryPayloadCreate(); - VERIFY_PARAM_NON_NULL(TAG, *temp, "Failed error initializing discovery payload"); - (*temp)->sid = di; - OCDiscoveryPayloadAddNewResource(*temp, resource); - } - } + } + else + { + err = ParseResources(&rootPayload, &rootMap); + VERIFY_CBOR_SUCCESS(TAG, err, "to parse resources"); } - err = cbor_value_leave_container(linkArray, &resourceMap); + err = cbor_value_leave_container(rootValue, &rootMap); VERIFY_CBOR_SUCCESS(TAG, err, "to leave resource map"); } else @@ -652,8 +657,6 @@ static OCStackResult OCParseDiscoveryPayloadVndOcfCbor(OCPayload **outPayload, C return OC_STACK_OK; exit: - OCDiscoveryEndpointDestroy(endpoint); - OCDiscoveryResourceDestroy(resource); OCDiscoveryPayloadDestroy(rootPayload); return ret; } |