1 //******************************************************************
3 // Copyright 2015 Samsung Electronics 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 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20 #include "rdpayload.h"
22 #include "oic_malloc.h"
23 #include "oic_string.h"
26 #include "ocpayload.h"
27 #include "payload_logging.h"
29 #define TAG "OIC_RI_RDPAYLOAD"
31 #define CBOR_ROOT_ARRAY_LENGTH 1
33 static CborError OCTagsPayloadToCbor(OCTagsPayload *tags, CborEncoder *setMap);
34 static CborError OCLinksPayloadToCbor(OCLinksPayload *rtPtr, CborEncoder *setMap);
35 static CborError OCTagsCborToPayload(CborValue *tagsMap, OCTagsPayload **tagsPayload);
36 static CborError OCLinksCborToPayload(CborValue *linksArray, OCLinksPayload **linksPayload);
37 static CborError FindStringInMap(const CborValue *map, const char *tags, char **value);
38 static CborError FindIntInMap(const CborValue *map, const char *tags, uint64_t *value);
39 static CborError FindStringLLInMap(const CborValue *linksMap, const char *tag, OCStringLL **links);
40 static CborError ConditionalAddTextStringToMap(CborEncoder* map, const char* key, const char *value);
41 static CborError ConditionalAddIntToMap(CborEncoder *map, const char *tags, const uint64_t *value);
42 static CborError AddStringLLToMap(CborEncoder *map, const char *tag, const OCStringLL *value);
44 CborError OCRDPayloadToCbor(const OCRDPayload *rdPayload, uint8_t *outPayload, size_t *size)
46 CborError cborEncoderResult = CborErrorIO;
49 VERIFY_PARAM_NON_NULL(TAG, rdPayload, "Invalid input parameter rdPayload");
50 VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid input parameter outPayload");
51 VERIFY_PARAM_NON_NULL(TAG, size, "Invalid input parameter size");
53 cbor_encoder_init(&encoder, outPayload, *size, flags);
55 if (rdPayload->rdDiscovery)
58 cborEncoderResult = cbor_encoder_create_map(&encoder, &map, CborIndefiniteLength);
59 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to create discovery map");
61 cborEncoderResult = ConditionalAddTextStringToMap(&map, OC_RSRVD_DEVICE_NAME,
62 rdPayload->rdDiscovery->n.deviceName);
63 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_DEVICE_NAME in map");
65 cborEncoderResult = ConditionalAddTextStringToMap(&map, OC_RSRVD_DEVICE_ID,
66 (char *)rdPayload->rdDiscovery->di.id);
67 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_DEVICE_ID in map");
70 uint64_t value = rdPayload->rdDiscovery->sel;
71 cborEncoderResult = ConditionalAddIntToMap(&map, OC_RSRVD_RD_DISCOVERY_SEL, &value);
72 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add RD_DISCOVERY_SEL in map");
74 cborEncoderResult = cbor_encoder_close_container(&encoder, &map);
75 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed closing discovery map");
77 else if (rdPayload->rdPublish)
80 cborEncoderResult = cbor_encoder_create_array(&encoder, &colArray, CborIndefiniteLength);
81 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to create collection array");
83 OCResourceCollectionPayload *rdPublish = rdPayload->rdPublish;
86 cborEncoderResult = OCTagsPayloadToCbor(rdPublish->tags, &colArray);
87 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed adding tags payload");
88 cborEncoderResult = OCLinksPayloadToCbor(rdPublish->setLinks, &colArray);
89 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed adding setLinks payload");
90 rdPublish = rdPublish->next;
92 cborEncoderResult = cbor_encoder_close_container(&encoder, &colArray);
93 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed closing collection array");
98 cborEncoderResult = cbor_encoder_create_map(&encoder, &map, CborIndefiniteLength);
99 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed entering discovery map");
100 cborEncoderResult = cbor_encoder_close_container(&encoder, &map);
101 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed closing discovery map");
103 *size = encoder.ptr - outPayload;
105 return cborEncoderResult;
109 return cborEncoderResult;
112 static CborError OCTagsPayloadToCbor(OCTagsPayload *tags, CborEncoder *setMap)
115 CborError cborEncoderResult = cbor_encoder_create_map(setMap, &tagsMap, CborIndefiniteLength);
116 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to create tags map");
118 cborEncoderResult = ConditionalAddTextStringToMap(&tagsMap, OC_RSRVD_DEVICE_NAME, tags->n.deviceName);
119 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_DEVICE_NAME in tags map");
121 cborEncoderResult = ConditionalAddTextStringToMap(&tagsMap, OC_RSRVD_DEVICE_ID,
122 (char *)tags->di.id);
123 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_DEVICE_ID in tags map");
125 cborEncoderResult = ConditionalAddTextStringToMap(&tagsMap, OC_RSRVD_RTS, tags->rts);
126 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_RTS in tags map");
128 cborEncoderResult = ConditionalAddTextStringToMap(&tagsMap, OC_RSRVD_DREL, tags->drel);
129 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_DREL in tags map");
131 cborEncoderResult = ConditionalAddTextStringToMap(&tagsMap, OC_RSRVD_BASE_URI, tags->baseURI);
132 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_BASE_URI in tags map");
135 uint64_t value = tags->bitmap;
136 cborEncoderResult = ConditionalAddIntToMap(&tagsMap, OC_RSRVD_BITMAP, &value);
137 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_BITMAP in tags map");
140 cborEncoderResult = ConditionalAddIntToMap(&tagsMap, OC_RSRVD_HOSTING_PORT, &value);
141 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_HOSTING_PORT in tags map");
144 cborEncoderResult = ConditionalAddIntToMap(&tagsMap, OC_RSRVD_INS, &value);
145 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_INS in tags map");
148 cborEncoderResult = ConditionalAddIntToMap(&tagsMap, OC_RSRVD_TTL, &value);
149 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_TTL in tags map");
152 cborEncoderResult = cbor_encoder_close_container(setMap, &tagsMap);
153 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to close container");
156 return cborEncoderResult;
159 static CborError OCLinksPayloadToCbor(OCLinksPayload *rtPtr, CborEncoder *setMap)
161 CborEncoder linksArray;
162 CborError cborEncoderResult;
164 cborEncoderResult = cbor_encoder_create_array(setMap, &linksArray, CborIndefiniteLength);
165 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to create Links array");
169 CborEncoder linksMap;
170 cborEncoderResult = cbor_encoder_create_map(&linksArray, &linksMap, CborIndefiniteLength);
171 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to create Links map");
173 cborEncoderResult = ConditionalAddTextStringToMap(&linksMap, OC_RSRVD_HREF, rtPtr->href);
174 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_HREF in Links map");
176 cborEncoderResult = ConditionalAddTextStringToMap(&linksMap, OC_RSRVD_REL, rtPtr->rel);
177 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_REL in Links map");
179 cborEncoderResult = ConditionalAddTextStringToMap(&linksMap, OC_RSRVD_TITLE, rtPtr->title);
180 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_TITLE in Links map");
182 cborEncoderResult = ConditionalAddTextStringToMap(&linksMap, OC_RSRVD_URI, rtPtr->uri);
183 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_URI in Links map");
185 cborEncoderResult = AddStringLLToMap(&linksMap, OC_RSRVD_RESOURCE_TYPE, rtPtr->rt);
186 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_RT in Links map");
188 cborEncoderResult = AddStringLLToMap(&linksMap, OC_RSRVD_INTERFACE, rtPtr->itf);
189 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_ITF in Links map");
191 cborEncoderResult = AddStringLLToMap(&linksMap, OC_RSRVD_MEDIA_TYPE, rtPtr->mt);
192 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_MT in Links map");
195 uint64_t value = rtPtr->ins;
196 cborEncoderResult = ConditionalAddIntToMap(&linksMap, OC_RSRVD_INS, &value);
197 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed to add OC_RSRVD_INS in Links map");
200 cborEncoderResult = cbor_encoder_close_container(&linksArray, &linksMap);
201 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed closing Links map");
205 cborEncoderResult = cbor_encoder_close_container(setMap, &linksArray);
206 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed closing links array");
209 return cborEncoderResult;
212 OCStackResult OCRDCborToPayload(const CborValue *cborPayload, OCPayload **outPayload)
214 CborValue *rdCBORPayload = (CborValue *)cborPayload;
215 OCStackResult ret = OC_STACK_NO_MEMORY;
216 CborError cborFindResult;
218 OCRDPayload *rdPayload = OCRDPayloadCreate();
219 VERIFY_PARAM_NON_NULL(TAG, rdPayload, "Failed allocating rdPayload");
221 ret = OC_STACK_MALFORMED_RESPONSE;
223 if (cbor_value_is_array(rdCBORPayload))
225 OCLinksPayload *linksPayload = NULL;
226 OCTagsPayload *tagsPayload = NULL;
228 while (cbor_value_is_container(rdCBORPayload))
232 cborFindResult = cbor_value_enter_container(rdCBORPayload, &tags);
233 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed entering tags container.");
235 cborFindResult= OCTagsCborToPayload(&tags, &tagsPayload);
236 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed parsing tags payload.");
237 OCTagsLog(DEBUG, tagsPayload);
239 cborFindResult = OCLinksCborToPayload(&tags, &linksPayload);
240 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed parsing links payload.");
241 OCLinksLog(DEBUG, linksPayload);
243 // Move from tags payload to links array.
244 cborFindResult = cbor_value_advance(rdCBORPayload);
245 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed advancing rdCborPayload.");
247 rdPayload->rdPublish = OCCopyCollectionResource(tagsPayload, linksPayload);
248 VERIFY_PARAM_NON_NULL(TAG, rdPayload->rdPublish, "Failed allocating rdPayload->rdPublish");
250 else if (cbor_value_is_map(rdCBORPayload))
252 rdPayload->rdDiscovery = (OCRDDiscoveryPayload *)OICCalloc(1, sizeof(OCRDDiscoveryPayload));
253 VERIFY_PARAM_NON_NULL(TAG, rdPayload->rdDiscovery, "Failed allocating discoveryPayload");
255 cborFindResult = FindStringInMap(rdCBORPayload, OC_RSRVD_DEVICE_NAME,
256 &rdPayload->rdDiscovery->n.deviceName);
257 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding OC_RSRVD_DEVICE_NAME.");
258 char *deviceId = NULL;
259 cborFindResult = FindStringInMap(rdCBORPayload, OC_RSRVD_DEVICE_ID, &deviceId);
262 memcpy(rdPayload->rdDiscovery->di.id, deviceId, strlen(deviceId));
265 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding OC_RSRVD_DEVICE_ID.");
269 cborFindResult = FindIntInMap(rdCBORPayload, OC_RSRVD_RD_DISCOVERY_SEL, &value);
270 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding OC_RSRVD_RD_DISCOVERY_SEL.");
271 rdPayload->rdDiscovery->sel = value;
274 cborFindResult = cbor_value_advance(rdCBORPayload);
275 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed advancing rdCBORPayload.");
277 OIC_LOG_PAYLOAD(DEBUG, (OCPayload *) rdPayload);
278 *outPayload = (OCPayload *)rdPayload;
282 OCRDPayloadDestroy(rdPayload);
286 static CborError FindStringInMap(const CborValue *map, const char *tags, char **value)
289 CborError cborFindResult = cbor_value_map_find_value(map, tags, &curVal);
290 if (CborNoError == cborFindResult && cbor_value_is_text_string(&curVal))
293 cborFindResult = cbor_value_dup_text_string(&curVal, value, &len, NULL);
295 return cborFindResult;
298 static CborError FindIntInMap(const CborValue *map, const char *tags, uint64_t *value)
301 CborError cborFindResult = cbor_value_map_find_value(map, tags, &curVal);
302 if (CborNoError == cborFindResult && cbor_value_is_unsigned_integer(&curVal))
304 cborFindResult = cbor_value_get_uint64(&curVal, value);
306 return cborFindResult;
309 static CborError FindStringLLInMap(const CborValue *linksMap, const char *tag, OCStringLL **links)
313 OCStringLL* llPtr = *links;
314 CborError cborFindResult = cbor_value_map_find_value(linksMap, tag, &rtArray);
315 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding tag");
318 cborFindResult = cbor_value_enter_container(&rtArray, &rtVal);
319 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed entering container");
321 while (cbor_value_is_text_string(&rtVal))
325 llPtr = (OCStringLL *)OICCalloc(1, sizeof(OCStringLL));
326 VERIFY_PARAM_NON_NULL(TAG, llPtr, "Failed allocating OCStringLL");
335 llPtr->next = (OCStringLL *)OICCalloc(1, sizeof(OCStringLL));
336 VERIFY_PARAM_NON_NULL(TAG, llPtr->next, "Failed allocating OCStringLL->next");
338 cborFindResult = cbor_value_dup_text_string(&rtVal, &(llPtr->value), &len, NULL);
339 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed duplicating value");
340 cborFindResult = cbor_value_advance(&rtVal);
341 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed advancing OCStringLL");
344 cborFindResult = cbor_value_leave_container(&rtArray, &rtVal);
345 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed leaving container");
348 return cborFindResult;
351 static CborError OCTagsCborToPayload(CborValue *tagsMap, OCTagsPayload **tagsPayload)
353 CborError cborFindResult = CborErrorOutOfMemory;
354 OCTagsPayload *tags = (OCTagsPayload *)OICCalloc(1, sizeof(OCTagsPayload));
355 VERIFY_PARAM_NON_NULL(TAG, tags, "Failed allocating tags");
357 if (cbor_value_is_map(tagsMap))
359 cborFindResult = FindStringInMap(tagsMap, OC_RSRVD_DEVICE_NAME, &tags->n.deviceName);
360 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding deviceName");
361 cborFindResult = FindStringInMap(tagsMap, OC_RSRVD_DREL, &tags->drel);
362 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding drel");
363 cborFindResult = FindStringInMap(tagsMap, OC_RSRVD_RTS, &tags->rts);
364 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding rts");
365 cborFindResult = FindStringInMap(tagsMap, OC_RSRVD_BASE_URI, &tags->baseURI);
366 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding baseURI");
367 char *deviceId = NULL;
368 cborFindResult = FindStringInMap(tagsMap, OC_RSRVD_DEVICE_ID, &deviceId);
371 memcpy(tags->di.id, deviceId, strlen(deviceId));
374 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding deviceId");
377 cborFindResult = FindIntInMap(tagsMap, OC_RSRVD_HOSTING_PORT, &value);
378 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding port");
381 cborFindResult = FindIntInMap(tagsMap, OC_RSRVD_BITMAP, &value);
382 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding bitmap");
383 tags->bitmap = value;
385 cborFindResult = FindIntInMap(tagsMap, OC_RSRVD_INS, &value);
386 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding ins");
389 cborFindResult = FindIntInMap(tagsMap, OC_RSRVD_TTL, &value);
392 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding ttl");
393 cborFindResult = cbor_value_advance(tagsMap);
394 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed advancing bitmap");
397 return cborFindResult;
400 OCFreeTagsResource(tags);
401 return cborFindResult;
404 static CborError OCLinksCborToPayload(CborValue *linksArray, OCLinksPayload **linksPayload)
407 OCLinksPayload *setLinks = NULL;
408 CborError cborFindResult = cbor_value_enter_container(linksArray, &linksMap);
409 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed entering links map container");
411 while (cbor_value_is_map(&linksMap))
413 setLinks = (OCLinksPayload *)OICCalloc(1, sizeof(OCLinksPayload));
414 VERIFY_PARAM_NON_NULL(TAG, setLinks, "Failed allocating setLinks");
416 cborFindResult = FindStringInMap(&linksMap, OC_RSRVD_HREF, &setLinks->href);
417 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding href value");
419 cborFindResult = FindStringInMap(&linksMap, OC_RSRVD_REL, &setLinks->rel);
420 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding rel value");
422 cborFindResult = FindStringInMap(&linksMap, OC_RSRVD_TITLE, &setLinks->title);
423 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding title value");
425 cborFindResult = FindStringInMap(&linksMap, OC_RSRVD_URI, &setLinks->uri);
426 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding uri value");
428 cborFindResult = FindStringLLInMap(&linksMap, OC_RSRVD_RESOURCE_TYPE, &setLinks->rt);
429 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding rt value");
431 cborFindResult = FindStringLLInMap(&linksMap, OC_RSRVD_INTERFACE, &setLinks->itf);
432 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding itf value");
434 cborFindResult = FindStringLLInMap(&linksMap, OC_RSRVD_MEDIA_TYPE, &setLinks->mt);
435 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding mt value");
439 cborFindResult = FindIntInMap(&linksMap, OC_RSRVD_INS, &value);
440 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed finding ins value");
441 setLinks->ins = value;
446 *linksPayload = setLinks;
450 OCLinksPayload *temp = *linksPayload;
455 temp->next = setLinks;
457 cborFindResult = cbor_value_advance(&linksMap);
458 VERIFY_CBOR_SUCCESS(TAG, cborFindResult, "Failed advancing links map");
461 return cborFindResult;
464 OCFreeLinksResource(*linksPayload);
465 OCFreeLinksResource(setLinks);
466 return cborFindResult;
469 static CborError AddTextStringToMap(CborEncoder* map, const char* key, const char* value)
471 CborError err = cbor_encode_text_string(map, key, strlen(key));
472 VERIFY_CBOR_SUCCESS(TAG, err, "Failed setting key value");
473 err = cbor_encode_text_string(map, value, strlen(value));
478 static CborError ConditionalAddTextStringToMap(CborEncoder* map, const char* key, const char* value)
480 return value ? AddTextStringToMap(map, key, value) : CborNoError;
483 static CborError ConditionalAddIntToMap(CborEncoder *map, const char *tags, const uint64_t *value)
485 CborError err = CborNoError;
488 err = cbor_encode_text_string(map, tags, strlen(tags));
489 VERIFY_CBOR_SUCCESS(TAG, err, "failed setting value");
490 err = cbor_encode_uint(map, *value);
496 static CborError AddStringLLToMap(CborEncoder *map, const char *tag, const OCStringLL *strType)
499 CborError cborEncoderResult;
500 cborEncoderResult = cbor_encode_text_string(map, tag, strlen(tag));
501 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed encoding string tag name");
502 cborEncoderResult = cbor_encoder_create_array(map, &array, CborIndefiniteLength);
503 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed creating stringLL array");
506 cborEncoderResult = cbor_encode_text_string(&array, strType->value, strlen(strType->value));
507 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed encoding string value");
508 strType = strType->next;
510 cborEncoderResult = cbor_encoder_close_container(map, &array);
511 VERIFY_CBOR_SUCCESS(TAG, cborEncoderResult, "Failed closing string array");
513 return cborEncoderResult;
516 OCRDPayload *OCRDPayloadCreate()
518 OCRDPayload *rdPayload = (OCRDPayload *)OICCalloc(1, sizeof(OCRDPayload));
519 VERIFY_PARAM_NON_NULL(TAG, rdPayload, "Failed allocating rdPayload");
520 rdPayload->base.type = PAYLOAD_TYPE_RD;
526 OCRDDiscoveryPayload *OCRDDiscoveryPayloadCreate(const char *deviceName, const char *id, int biasFactor)
528 OCRDDiscoveryPayload *discoveryPayload = (OCRDDiscoveryPayload *)OICCalloc(1, sizeof(OCRDDiscoveryPayload));
529 VERIFY_PARAM_NON_NULL(TAG, discoveryPayload, "Failed allocating memory for discovery payload");
533 discoveryPayload->n.deviceName = OICStrdup(deviceName);
534 VERIFY_PARAM_NON_NULL(TAG, discoveryPayload->n.deviceName,
535 "Failed allocating memory for discovery device name");
539 OICStrcpy((char*)discoveryPayload->di.id, MAX_IDENTITY_SIZE, id);
542 discoveryPayload->sel = biasFactor;
543 return discoveryPayload;
545 OICFree(discoveryPayload);
546 discoveryPayload = NULL;
547 return discoveryPayload;
550 void OCRDPayloadDestroy(OCRDPayload *payload)
557 if (payload->rdDiscovery)
559 if (payload->rdDiscovery->n.deviceName)
561 OICFree(payload->rdDiscovery->n.deviceName);
563 OICFree(payload->rdDiscovery);
566 if (payload->rdPublish)
568 for (OCResourceCollectionPayload *col = payload->rdPublish; col; )
572 OCFreeLinksResource(col->setLinks);
577 OCFreeTagsResource(col->tags);
579 OCResourceCollectionPayload *temp = col->next;
588 OCTagsPayload* OCCopyTagsResources(const char *deviceName, const unsigned char *id, const char *baseURI,
589 uint8_t bitmap, uint16_t port, uint8_t ins, const char *rts,const char *drel, uint32_t ttl)
591 OCTagsPayload *tags = (OCTagsPayload *)OICCalloc(1, sizeof(OCTagsPayload));
598 tags->n.deviceName = OICStrdup(deviceName);
599 if (!tags->n.deviceName)
601 goto memory_allocation_failed;
606 OICStrcpy((char*)tags->di.id, MAX_IDENTITY_SIZE, (char *)id);
609 goto memory_allocation_failed;
614 tags->baseURI = OICStrdup(baseURI);
617 goto memory_allocation_failed;
620 tags->bitmap = bitmap;
625 tags->rts = OICStrdup(rts);
628 goto memory_allocation_failed;
633 tags->drel = OICStrdup(drel);
636 goto memory_allocation_failed;
642 memory_allocation_failed:
643 OIC_LOG(ERROR, TAG, "Memory allocation failed.");
644 OCFreeTagsResource(tags);
648 OCLinksPayload* OCCopyLinksResources(const char *href, OCStringLL *rt, OCStringLL *itf,
649 const char *rel, bool obs, const char *title, const char *uri, uint8_t ins, OCStringLL *mt)
651 OCLinksPayload *links = (OCLinksPayload *)OICCalloc(1, sizeof(OCLinksPayload));
654 OIC_LOG(ERROR, TAG, "Failed allocating memory.");
659 links->href = OICStrdup(href);
662 goto memory_allocation_failed;
667 links->rt = CloneOCStringLL(rt);
670 goto memory_allocation_failed;
675 links->itf = CloneOCStringLL(itf);
678 goto memory_allocation_failed;
683 links->rel = OICStrdup(rel);
686 goto memory_allocation_failed;
692 links->title = OICStrdup(title);
695 goto memory_allocation_failed;
700 links->uri = OICStrdup(uri);
703 goto memory_allocation_failed;
709 links->mt = CloneOCStringLL(mt);
712 goto memory_allocation_failed;
718 memory_allocation_failed:
719 OIC_LOG(ERROR, TAG, "Memory allocation failed.");
720 OCFreeLinksResource(links);
724 OCResourceCollectionPayload* OCCopyCollectionResource(OCTagsPayload *tags, OCLinksPayload *links)
726 OCResourceCollectionPayload *pl = NULL;
727 VERIFY_PARAM_NON_NULL(TAG, tags, "Invalid param tags");
728 VERIFY_PARAM_NON_NULL(TAG, links, "Invalid param links");
730 pl = (OCResourceCollectionPayload *)OICCalloc(1, sizeof(OCResourceCollectionPayload));
731 VERIFY_PARAM_NON_NULL(TAG, pl, "Failed allocating memory for the OCResourceCollectionPayload");
734 pl->setLinks = links;
740 void OCFreeLinksResource(OCLinksPayload *payload)
746 OICFree(payload->href);
747 OCFreeOCStringLL(payload->rt);
748 OCFreeOCStringLL(payload->itf);
749 OICFree(payload->rel);
750 OICFree(payload->title);
751 OICFree(payload->uri);
752 OCFreeOCStringLL(payload->mt);
753 OCFreeLinksResource(payload->next);
757 void OCFreeTagsResource(OCTagsPayload *payload)
763 OICFree(payload->n.deviceName);
764 OICFree(payload->baseURI);
765 OICFree(payload->rts);
766 OICFree(payload->drel);
770 void OCFreeCollectionResource(OCResourceCollectionPayload *payload)
778 OCFreeTagsResource(payload->tags);
780 if (payload->setLinks)
782 OCFreeLinksResource(payload->setLinks);
784 OCFreeCollectionResource(payload->next);
788 void OCTagsLog(const LogLevel level, const OCTagsPayload *tags)
792 if (tags->n.deviceName)
794 OIC_LOG_V(level, TAG, " Device Name : %s ",tags->n.deviceName);
798 OIC_LOG_V(level, TAG, " Base URI : %s ",tags->baseURI);
800 OIC_LOG_V(level, TAG, " Device ID : %s ",tags->di.id);
801 OIC_LOG_V(level, TAG, " Bitmap : %d ",tags->bitmap);
802 OIC_LOG_V(level, TAG, " Port : %d ",tags->port);
803 OIC_LOG_V(level, TAG, " Ins : %d ",tags->ins);
804 OIC_LOG_V(level, TAG, " Ttl : %d ",tags->ttl);
808 OIC_LOG_V(level, TAG, " RTS : %s ",tags->rts);
812 OIC_LOG_V(level, TAG, " DREL : %s ",tags->drel);
821 void OCLinksLog(const LogLevel level, const OCLinksPayload *links)
827 OIC_LOG_V(level, TAG, " href: %s ",links->href);
829 OIC_LOG(level, TAG, " RT: ");
830 OCStringLL *rt = links->rt;
835 OIC_LOG_V(level, TAG, " %s", rt->value);
839 OIC_LOG(level, TAG, " IF: ");
840 OCStringLL *itf = links->itf;
845 OIC_LOG_V(level, TAG, " %s", itf->value);
849 OIC_LOG(level, TAG, " MT: ");
850 OCStringLL *mt = links->mt;
855 OIC_LOG_V(level, TAG, " %s", mt->value);
859 OIC_LOG_V(level, TAG, " INS: %d", links->ins);
860 OIC_LOG_V(level, TAG, " OBS: %d", links->obs);
863 OIC_LOG_V(level, TAG, " REL: %s", links->rel);
867 OIC_LOG_V(level, TAG, " TITLE: %s", links->title);
871 OIC_LOG_V(level, TAG, " URI: %s", links->uri);