1 //******************************************************************
3 // Copyright 2015 Intel Mobile Communications GmbH All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #include "ocpayloadcbor.h"
24 #include "oic_malloc.h"
25 #include "ocstackinternal.h"
26 #include "ocpayload.h"
29 #define TAG PCF("OCPayloadParse")
31 static OCStackResult OCParseDiscoveryPayload(OCPayload** outPayload, CborValue* arrayVal);
32 static OCStackResult OCParseDevicePayload(OCPayload** outPayload, CborValue* arrayVal);
33 static OCStackResult OCParsePlatformPayload(OCPayload** outPayload, CborValue* arrayVal);
34 static bool OCParseSingleRepPayload(OCRepPayload** outPayload, CborValue* repParent);
35 static OCStackResult OCParseRepPayload(OCPayload** outPayload, CborValue* arrayVal);
36 static OCStackResult OCParsePresencePayload(OCPayload** outPayload, CborValue* arrayVal);
37 static OCStackResult OCParseSecurityPayload(OCPayload** outPayload, CborValue* arrayVal);
39 OCStackResult OCParsePayload(OCPayload** outPayload, const uint8_t* payload, size_t payloadSize)
45 OC_LOG_V(INFO, TAG, "CBOR Parsing size: %d", payloadSize, payload);
46 if((err = cbor_parser_init(payload, payloadSize, 0, &parser, &rootValue)) != false)
48 OC_LOG_V(ERROR, TAG, "CBOR Parser init failed: %d", err);
49 return OC_STACK_ERROR;
52 if(!cbor_value_is_array(&rootValue))
54 OC_LOG_V(ERROR, TAG, "CBOR payload root object is not an array :%x", rootValue.type);
55 return OC_STACK_MALFORMED_RESPONSE;
60 err = err || cbor_value_enter_container(&rootValue, &arrayValue);
63 err = err || cbor_value_get_int(&arrayValue, &payloadType);
64 err = err || cbor_value_advance_fixed(&arrayValue);
68 OC_LOG_V(ERROR, TAG, "CBOR payload parse failed :%d", err);
69 return OC_STACK_MALFORMED_RESPONSE;
72 OCStackResult result = OC_STACK_ERROR;
75 case PAYLOAD_TYPE_DISCOVERY:
76 result = OCParseDiscoveryPayload(outPayload, &arrayValue);
78 case PAYLOAD_TYPE_DEVICE:
79 result = OCParseDevicePayload(outPayload, &arrayValue);
81 case PAYLOAD_TYPE_PLATFORM:
82 result = OCParsePlatformPayload(outPayload, &arrayValue);
84 case PAYLOAD_TYPE_REPRESENTATION:
85 result = OCParseRepPayload(outPayload, &arrayValue);
87 case PAYLOAD_TYPE_PRESENCE:
88 result = OCParsePresencePayload(outPayload, &arrayValue);
90 case PAYLOAD_TYPE_SECURITY:
91 result = OCParseSecurityPayload(outPayload, &arrayValue);
94 OC_LOG_V(ERROR, TAG, "ParsePayload Type default: %d", payloadType);
95 result = OC_STACK_ERROR;
99 if(result == OC_STACK_OK)
101 err = err || cbor_value_leave_container(&rootValue, &arrayValue);
102 if(err != CborNoError)
104 return OC_STACK_MALFORMED_RESPONSE;
109 OC_LOG_V(INFO, TAG, "Finished parse payload, result is %d", result);
115 void OCFreeOCStringLL(OCStringLL* ll);
117 static OCStackResult OCParseSecurityPayload(OCPayload** outPayload, CborValue* arrayVal)
120 char * securityData = NULL;
122 if(cbor_value_is_map(arrayVal))
125 err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_REPRESENTATION, &curVal);
127 if(cbor_value_is_valid(&curVal))
130 err = err || cbor_value_dup_text_string(&curVal, &securityData, &len, NULL);
135 OC_LOG_V(ERROR, TAG, PCF("Cbor main value not a map"));
136 return OC_STACK_MALFORMED_RESPONSE;
139 err = err || cbor_value_advance(arrayVal);
143 OC_LOG_V(ERROR, TAG, "Cbor in error condition");
144 OICFree(securityData);
145 return OC_STACK_MALFORMED_RESPONSE;
148 *outPayload = (OCPayload*)OCSecurityPayloadCreate(securityData);
149 OICFree(securityData);
155 static OCStackResult OCParseDiscoveryPayload(OCPayload** outPayload, CborValue* arrayVal)
159 OCDiscoveryPayload* out = OCDiscoveryPayloadCreate();
163 return OC_STACK_NO_MEMORY;
166 size_t resourceCount = 0;
168 cbor_value_is_map(arrayVal))
170 OCResourcePayload* resource = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
173 OC_LOG_V(ERROR, TAG, "Memory allocation failed");
174 OCDiscoveryPayloadDestroy(out);
175 return OC_STACK_NO_MEMORY;
180 err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_HREF, &curVal);
182 err = err || cbor_value_dup_text_string(&curVal, &(resource->uri), &len, NULL);
185 err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_SERVER_INSTANCE_ID, &curVal);
186 err = err || cbor_value_dup_byte_string(&curVal, &(resource->sid), &len, NULL);
190 err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_PROPERTY, &curVal);
193 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_RESOURCE_TYPE, &rtArray);
196 err = err || cbor_value_enter_container(&rtArray, &rtVal);
198 OCStringLL* llPtr = NULL;
199 while(!err && cbor_value_is_text_string(&rtVal))
201 if(resource->types == NULL)
203 resource->types = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
204 llPtr = resource->types;
207 OC_LOG(ERROR, TAG, PCF("Memory allocation failed"));
208 OICFree(resource->uri);
209 OICFree(resource->sid);
211 OCDiscoveryPayloadDestroy(out);
212 return OC_STACK_NO_MEMORY;
217 llPtr->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
221 OC_LOG(ERROR, TAG, PCF("Memory allocation failed"));
222 OICFree(resource->uri);
223 OICFree(resource->sid);
224 OCFreeOCStringLL(resource->types);
226 OCDiscoveryPayloadDestroy(out);
227 return OC_STACK_NO_MEMORY;
232 OC_LOG(ERROR, TAG, PCF("Unknown state in resource type copying"));
233 OICFree(resource->uri);
234 OICFree(resource->sid);
235 OCFreeOCStringLL(resource->types);
237 OCDiscoveryPayloadDestroy(out);
238 return OC_STACK_NO_MEMORY;
241 err = err || cbor_value_dup_text_string(&rtVal, &(llPtr->value), &len, NULL);
242 err = err || cbor_value_advance(&rtVal);
245 err = err || cbor_value_leave_container(&rtArray, &rtVal);
249 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_INTERFACE, &ifArray);
251 err = err || cbor_value_enter_container(&ifArray, &ifVal);
254 while(!err && cbor_value_is_text_string(&ifVal))
256 if(resource->interfaces == NULL)
258 resource->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
259 llPtr = resource->interfaces;
262 OC_LOG_V(ERROR, TAG, "Memory allocation failed");
263 OICFree(resource->uri);
264 OICFree(resource->sid);
265 OCFreeOCStringLL(resource->types);
267 OCDiscoveryPayloadDestroy(out);
268 return OC_STACK_NO_MEMORY;
273 llPtr->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
277 OC_LOG_V(ERROR, TAG, "Memory allocation failed");
278 OICFree(resource->uri);
279 OICFree(resource->sid);
280 OCFreeOCStringLL(resource->types);
281 OCFreeOCStringLL(resource->interfaces);
283 OCDiscoveryPayloadDestroy(out);
284 return OC_STACK_NO_MEMORY;
289 OC_LOG(ERROR, TAG, PCF("Unknown state in resource interfaces copying"));
290 OICFree(resource->uri);
291 OICFree(resource->sid);
292 OCFreeOCStringLL(resource->types);
294 OCDiscoveryPayloadDestroy(out);
295 return OC_STACK_NO_MEMORY;
298 err = err || cbor_value_dup_text_string(&ifVal, &(llPtr->value), &len, NULL);
299 err = err || cbor_value_advance(&ifVal);
301 err = err || cbor_value_leave_container(&ifArray, &ifVal);
306 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_POLICY, &policyMap);
310 err = err || cbor_value_map_find_value(&policyMap, OC_RSRVD_BITMAP, &val);
312 err = err || cbor_value_get_uint64(&val, &temp);
313 resource->bitmap = (uint8_t)temp;
315 err = err || cbor_value_map_find_value(&policyMap, OC_RSRVD_SECURE, &val);
316 if(cbor_value_is_valid(&val))
318 err = err || cbor_value_get_boolean(&val, &(resource->secure));
321 err = err || cbor_value_map_find_value(&policyMap, OC_RSRVD_HOSTING_PORT,
323 if(cbor_value_is_valid(&port))
325 err = err || cbor_value_get_uint64(&port, &temp);
326 resource->port = (uint16_t)temp;
332 err = err || cbor_value_advance(arrayVal);
335 OICFree(resource->uri);
336 OICFree(resource->sid);
337 OCFreeOCStringLL(resource->types);
338 OCFreeOCStringLL(resource->interfaces);
340 OCDiscoveryPayloadDestroy(out);
341 OC_LOG_V(ERROR, TAG, "CBOR in error condition", err);
342 return OC_STACK_MALFORMED_RESPONSE;
345 OCDiscoveryPayloadAddNewResource(out, resource);
350 OCDiscoveryPayloadDestroy(out);
351 return OC_STACK_MALFORMED_RESPONSE;
355 *outPayload = (OCPayload*)out;
360 static OCStackResult OCParseDevicePayload(OCPayload** outPayload, CborValue* arrayVal)
364 if(cbor_value_is_map(arrayVal))
369 char* specVer = NULL;
372 err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_HREF, &curVal);
374 err = err || cbor_value_dup_text_string(&curVal, &uri, &len, NULL);
378 err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_REPRESENTATION, &curVal);
382 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_DEVICE_ID, &repVal);
383 err = err || cbor_value_dup_byte_string(&repVal, &sid, &len, NULL);
385 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_DEVICE_NAME, &repVal);
386 err = err || cbor_value_dup_text_string(&repVal, &dname, &len, NULL);
387 // Device Spec Version
388 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_SPEC_VERSION, &repVal);
389 err = err || cbor_value_dup_text_string(&repVal, &specVer, &len, NULL);
390 // Data Model Version
391 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_DATA_MODEL_VERSION, &repVal);
392 err = err || cbor_value_dup_text_string(&repVal, &dmVer, &len, NULL);
396 err = err || cbor_value_advance(arrayVal);
405 OC_LOG_V(ERROR, TAG, "CBOR in error condition %d", err);
406 return OC_STACK_MALFORMED_RESPONSE;
409 *outPayload = (OCPayload*)OCDevicePayloadCreate(uri, sid, dname, specVer, dmVer);
418 return OC_STACK_NO_MEMORY;
425 OC_LOG(ERROR, TAG, PCF("Root device node was not a map"));
426 return OC_STACK_MALFORMED_RESPONSE;
431 static OCStackResult OCParsePlatformPayload(OCPayload** outPayload, CborValue* arrayVal)
435 if(cbor_value_is_map(arrayVal))
438 OCPlatformInfo info = {0};
440 err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_HREF, &curVal);
442 err = err || cbor_value_dup_text_string(&curVal, &uri, &len, NULL);
446 err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_REPRESENTATION, &curVal);
450 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_PLATFORM_ID, &repVal);
451 err = err || cbor_value_dup_text_string(&repVal, &(info.platformID), &len, NULL);
454 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_MFG_NAME, &repVal);
455 err = err || cbor_value_dup_text_string(&repVal, &(info.manufacturerName), &len, NULL);
458 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_MFG_URL, &repVal);
459 if(cbor_value_is_valid(&repVal))
461 err = err || cbor_value_dup_text_string(&repVal, &(info.manufacturerUrl), &len, NULL);
465 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_MODEL_NUM, &repVal);
466 if(cbor_value_is_valid(&repVal))
468 err = err || cbor_value_dup_text_string(&repVal, &(info.modelNumber), &len, NULL);
472 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_MFG_DATE, &repVal);
473 if(cbor_value_is_valid(&repVal))
475 err = err || cbor_value_dup_text_string(&repVal, &(info.dateOfManufacture), &len,
480 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_PLATFORM_VERSION, &repVal);
481 if(cbor_value_is_valid(&repVal))
483 err = err || cbor_value_dup_text_string(&repVal, &(info.platformVersion), &len,
488 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_OS_VERSION, &repVal);
489 if(cbor_value_is_valid(&repVal))
491 err = err || cbor_value_dup_text_string(&repVal, &(info.operatingSystemVersion),
496 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_HARDWARE_VERSION, &repVal);
497 if(cbor_value_is_valid(&repVal))
499 err = err || cbor_value_dup_text_string(&repVal, &(info.hardwareVersion), &len,
504 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_FIRMWARE_VERSION, &repVal);
505 if(cbor_value_is_valid(&repVal))
507 err = err || cbor_value_dup_text_string(&repVal, &(info.firmwareVersion), &len,
512 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_SUPPORT_URL, &repVal);
513 if(cbor_value_is_valid(&repVal))
515 err = err || cbor_value_dup_text_string(&repVal, &(info.supportUrl), &len, NULL);
519 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_SYSTEM_TIME, &repVal);
520 if(cbor_value_is_valid(&repVal))
522 err = err || cbor_value_dup_text_string(&repVal, &(info.systemTime), &len, NULL);
526 err = err || cbor_value_advance(arrayVal);
530 OICFree(info.dateOfManufacture);
531 OICFree(info.firmwareVersion);
532 OICFree(info.hardwareVersion);
533 OICFree(info.manufacturerName);
534 OICFree(info.manufacturerUrl);
535 OICFree(info.modelNumber);
536 OICFree(info.operatingSystemVersion);
537 OICFree(info.platformID);
538 OICFree(info.platformVersion);
539 OICFree(info.supportUrl);
540 OICFree(info.systemTime);
541 OC_LOG(ERROR, TAG, PCF("CBOR error In ParsePlatformPayload"));
542 return OC_STACK_MALFORMED_RESPONSE;
545 *outPayload = (OCPayload*)OCPlatformPayloadCreateAsOwner(uri, &info);
549 return OC_STACK_NO_MEMORY;
556 OC_LOG(ERROR, TAG, PCF("Root device node was not a map"));
557 return OC_STACK_MALFORMED_RESPONSE;
561 static bool OCParseArray(OCRepPayload* out, const char* name, CborValue* container)
563 CborValue insideArray;
565 uint64_t tempInt = 0;
566 OCRepPayloadPropType type;
567 size_t dimensions[MAX_REP_ARRAY_DEPTH];
568 err = err || cbor_value_enter_container(container, &insideArray);
570 err = err || cbor_value_get_uint64(&insideArray, &tempInt);
571 err = err || cbor_value_advance_fixed(&insideArray);
572 type = (OCRepPayloadPropType)tempInt;
574 for(int i = 0; i < MAX_REP_ARRAY_DEPTH; ++ i)
576 err = err || cbor_value_get_uint64(&insideArray, &tempInt);
577 err = err || cbor_value_advance_fixed(&insideArray);
578 dimensions[i] = tempInt;
581 size_t dimTotal = calcDimTotal(dimensions);
590 arr = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
593 for(size_t i = 0; i < dimTotal && !err; ++i)
595 err = err || cbor_value_get_int64(&insideArray, &(((int64_t*)arr)[i]));
596 err = err || cbor_value_advance_fixed(&insideArray);
598 if(err || !OCRepPayloadSetIntArrayAsOwner(out, name, (int64_t*)arr, dimensions))
609 case OCREP_PROP_DOUBLE:
610 arr = (double*)OICMalloc(dimTotal * sizeof(double));
613 for(size_t i = 0; i < dimTotal && !err; ++i)
615 err = err || cbor_value_get_double(&insideArray, &(((double*)arr)[i]));
616 err = err || cbor_value_advance_fixed(&insideArray);
618 if(err || !OCRepPayloadSetDoubleArrayAsOwner(out, name, (double*)arr, dimensions))
629 case OCREP_PROP_BOOL:
630 arr = (bool*)OICMalloc(dimTotal * sizeof(bool));
633 for(size_t i = 0; i < dimTotal && !err; ++i)
635 err = err || cbor_value_get_boolean(&insideArray, &(((bool*)arr)[i]));
636 err = err || cbor_value_advance_fixed(&insideArray);
638 if(err || !OCRepPayloadSetBoolArrayAsOwner(out, name, (bool*)arr, dimensions))
649 case OCREP_PROP_STRING:
650 arr = (char**)OICMalloc(dimTotal * sizeof(char*));
653 for(size_t i = 0; i < dimTotal && !err; ++i)
655 err = err || cbor_value_dup_text_string(&insideArray, &tempStr,
657 err = err || cbor_value_advance(&insideArray);
658 ((char**)arr)[i] = tempStr;
660 if(err || !OCRepPayloadSetStringArrayAsOwner(out, name, (char**)arr, dimensions))
671 case OCREP_PROP_OBJECT:
672 arr = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
675 for(size_t i = 0; i < dimTotal && !err; ++i)
678 err = err || OCParseSingleRepPayload(&pl, &insideArray);
679 err = err || cbor_value_advance(&insideArray);
680 ((OCRepPayload**)arr)[i] = pl;
682 if(err || !OCRepPayloadSetPropObjectArrayAsOwner(out, name,
683 (OCRepPayload**)arr, dimensions))
695 OC_LOG(ERROR, TAG, "Invalid Array type in Parse Array");
703 static bool OCParseSingleRepPayload(OCRepPayload** outPayload, CborValue* repParent)
705 *outPayload = OCRepPayloadCreate();
706 OCRepPayload* curPayload = *outPayload;
710 return CborErrorOutOfMemory;
715 err = err || cbor_value_map_find_value(repParent, OC_RSRVD_HREF, &curVal);
716 if(cbor_value_is_valid(&curVal))
718 err = err || cbor_value_dup_text_string(&curVal, &curPayload->uri, &len,
722 err = err || cbor_value_map_find_value(repParent, OC_RSRVD_PROPERTY, &curVal);
723 if(cbor_value_is_valid(&curVal))
725 CborValue insidePropArray = {0};
726 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_RESOURCE_TYPE,
729 if(cbor_value_is_array(&insidePropArray))
732 err = err || cbor_value_enter_container(&insidePropArray, &rtArray);
734 while(!err && cbor_value_is_valid(&rtArray))
737 err = err || cbor_value_dup_text_string(&rtArray, &curRt, &len, NULL);
738 err = err || cbor_value_advance(&rtArray);
739 OCRepPayloadAddResourceTypeAsOwner(curPayload, curRt);
742 err = err || cbor_value_leave_container(&insidePropArray, &rtArray);
745 err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_INTERFACE, &insidePropArray);
747 if(cbor_value_is_array(&insidePropArray))
750 err = err || cbor_value_enter_container(&insidePropArray, &ifArray);
752 while(!err && cbor_value_is_valid(&ifArray))
755 err = err || cbor_value_dup_text_string(&ifArray, &curIf, &len, NULL);
756 err = err || cbor_value_advance(&ifArray);
757 OCRepPayloadAddInterfaceAsOwner(curPayload, curIf);
760 err = err || cbor_value_leave_container(&insidePropArray, &ifArray);
763 err = err || cbor_value_map_find_value(repParent, OC_RSRVD_REPRESENTATION, &curVal);
764 if(cbor_value_is_map(&curVal))
767 err = err || cbor_value_enter_container(&curVal, &repMap);
769 while(!err && cbor_value_is_valid(&repMap))
772 err = err || cbor_value_dup_text_string(&repMap, &name, &len, NULL);
774 err = err || cbor_value_advance(&repMap);
777 bool boolval = false;
779 double doubleval = 0;
782 switch(cbor_value_get_type(&repMap))
785 err = !OCRepPayloadSetNull(curPayload, name);
787 case CborIntegerType:
788 err = err || cbor_value_get_int64(&repMap, &intval);
791 err = !OCRepPayloadSetPropInt(curPayload, name, intval);
795 err = err || cbor_value_get_double(&repMap, &doubleval);
798 err = !OCRepPayloadSetPropDouble(curPayload, name, doubleval);
801 case CborBooleanType:
802 err = err || cbor_value_get_boolean(&repMap, &boolval);
805 err = !OCRepPayloadSetPropBool(curPayload, name, boolval);
808 case CborTextStringType:
809 err = err || cbor_value_dup_text_string(&repMap, &strval, &len, NULL);
812 err = !OCRepPayloadSetPropStringAsOwner(curPayload, name, strval);
816 err = err || OCParseSingleRepPayload(&pl, &repMap);
819 err = !OCRepPayloadSetPropObjectAsOwner(curPayload, name, pl);
823 err = err || OCParseArray(curPayload, name, &repMap);
826 OC_LOG_V(ERROR, TAG, "Parsing rep property, unknown type %d", repMap.type);
830 err = err || cbor_value_advance(&repMap);
833 err = err || cbor_value_leave_container(&curVal, &repMap);
838 OCRepPayloadDestroy(*outPayload);
844 static OCStackResult OCParseRepPayload(OCPayload** outPayload, CborValue* arrayVal)
848 OCRepPayload* rootPayload = NULL;
849 OCRepPayload* curPayload = NULL;
850 OCRepPayload* temp = NULL;
851 while(!err && cbor_value_is_map(arrayVal))
853 err = err || OCParseSingleRepPayload(&temp, arrayVal);
855 if(rootPayload == NULL)
862 curPayload->next = temp;
863 curPayload = curPayload->next;
867 err = err || cbor_value_advance(arrayVal);
870 OCRepPayloadDestroy(rootPayload);
871 OC_LOG_V(ERROR, TAG, PCF("CBOR error in ParseRepPayload"));
872 return OC_STACK_MALFORMED_RESPONSE;
876 *outPayload = (OCPayload*)rootPayload;
881 static OCStackResult OCParsePresencePayload(OCPayload** outPayload, CborValue* arrayVal)
884 if(cbor_value_is_map(arrayVal))
888 OCPresenceTrigger trigger = OC_PRESENCE_TRIGGER_CREATE;
889 char* tempStr = NULL;
894 err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_NONCE, &curVal);
895 err = err || cbor_value_get_uint64(&curVal, &seqNum);
898 err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_TTL, &curVal);
899 err = err || cbor_value_get_uint64(&curVal, &maxAge);
902 err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_TRIGGER, &curVal);
903 err = err || cbor_value_dup_text_string(&curVal, &tempStr, &len, NULL);
904 trigger = convertTriggerStringToEnum(tempStr);
908 // Resource type name
909 err = err || cbor_value_map_find_value(arrayVal, OC_RSRVD_RESOURCE_TYPE, &curVal);
910 if(cbor_value_is_valid(&curVal))
912 err = err || cbor_value_dup_text_string(&curVal, &tempStr, &len, NULL);
915 err = err || cbor_value_advance(arrayVal);
919 *outPayload = (OCPayload*)OCPresencePayloadCreate(seqNum, maxAge, trigger, tempStr);
925 OCPayloadDestroy(*outPayload);
926 OC_LOG_V(ERROR, TAG, PCF("CBOR error Parse Presence Payload"));
927 return OC_STACK_MALFORMED_RESPONSE;
932 return OC_STACK_NO_MEMORY;
939 OC_LOG(ERROR, TAG, PCF("Root presence node was not a map"));
940 return OC_STACK_MALFORMED_RESPONSE;