Update a CBOR parser logic for well-known keywords to OIC
authorJihun Ha <jihun.ha@samsung.com>
Wed, 9 Mar 2016 05:15:28 +0000 (14:15 +0900)
committerHabib Virji <habib.virji@samsung.com>
Thu, 10 Mar 2016 13:50:16 +0000 (13:50 +0000)
I've updated a CBOR parsing logic When CBOR parser encounters a well-known
keyword like "href" as an attribute.
If the attribute is *NOT* on the outermost representation bracket, it is
treated as a normal attribute.

Change-Id: I1f1c28dd59ae09e1f3f8ab0188c59a1b9fc3b950
Signed-off-by: Jihun Ha <jihun.ha@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/5623
Reviewed-by: Habib Virji <habib.virji@samsung.com>
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
resource/csdk/stack/src/ocpayloadparse.c [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 93cdabe..8a64a2c
@@ -41,7 +41,7 @@
 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);
+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);
@@ -675,7 +675,7 @@ static CborError OCParseArrayFillArray(const CborValue *parent,
                 case OCREP_PROP_OBJECT:
                     if (dimensions[1] == 0)
                     {
-                        err = OCParseSingleRepPayload(&tempPl, &insideArray);
+                        err = OCParseSingleRepPayload(&tempPl, &insideArray, false);
                         ((OCRepPayload**)targetArray)[i] = tempPl;
                         tempPl = NULL;
                         noAdvance = true;
@@ -787,7 +787,7 @@ exit:
     return err;
 }
 
-static CborError OCParseSingleRepPayload(OCRepPayload **outPayload, CborValue *objMap)
+static CborError OCParseSingleRepPayload(OCRepPayload **outPayload, CborValue *objMap, bool isRoot)
 {
     CborError err = CborUnknownError;
     char *name = NULL;
@@ -822,6 +822,7 @@ static CborError OCParseSingleRepPayload(OCRepPayload **outPayload, CborValue *o
                 err = cbor_value_advance(&repMap);
                 VERIFY_CBOR_SUCCESS(TAG, err, "Failed advancing rootMap");
                 if (name &&
+                    isRoot &&
                     ((0 == strcmp(OC_RSRVD_HREF, name)) ||
                      (0 == strcmp(OC_RSRVD_RESOURCE_TYPE, name)) ||
                     (0 == strcmp(OC_RSRVD_INTERFACE, name))))
@@ -881,7 +882,7 @@ static CborError OCParseSingleRepPayload(OCRepPayload **outPayload, CborValue *o
                 case CborMapType:
                     {
                         OCRepPayload *pl = NULL;
-                        err = OCParseSingleRepPayload(&pl, &repMap);
+                        err = OCParseSingleRepPayload(&pl, &repMap, false);
                         VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting parse single rep");
                         res = OCRepPayloadSetPropObjectAsOwner(curPayload, name, pl);
                     }
@@ -933,7 +934,6 @@ static OCStackResult OCParseRepPayload(OCPayload **outPayload, CborValue *root)
     VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid Parameter outPayload");
     VERIFY_PARAM_NON_NULL(TAG, root, "Invalid Parameter root");
 
-
     *outPayload = NULL;
     if (cbor_value_is_array(root))
     {
@@ -980,7 +980,7 @@ static OCStackResult OCParseRepPayload(OCPayload **outPayload, CborValue *root)
 
         if (cbor_value_is_map(&rootMap))
         {
-            err = OCParseSingleRepPayload(&temp, &rootMap);
+            err = OCParseSingleRepPayload(&temp, &rootMap, true);
             VERIFY_CBOR_SUCCESS(TAG, err, "Failed to parse single rep payload");
         }
         if(rootPayload == NULL)