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 // Required for strok_r
22 #define _POSIX_C_SOURCE 200112L
24 #include "iotivity_config.h"
26 #include "ocpayload.h"
29 #include "oic_malloc.h"
30 #include "oic_string.h"
31 #include "ocstackinternal.h"
32 #include "ocresource.h"
34 #include "ocendpoint.h"
37 #define TAG "OIC_RI_PAYLOAD"
38 #define CSV_SEPARATOR ','
39 #define MASK_SECURE_FAMS (OC_FLAG_SECURE | OC_MASK_FAMS)
41 static void OCFreeRepPayloadValueContents(OCRepPayloadValue* val);
43 void OCPayloadDestroy(OCPayload* payload)
52 case PAYLOAD_TYPE_REPRESENTATION:
53 OCRepPayloadDestroy((OCRepPayload*)payload);
55 case PAYLOAD_TYPE_DISCOVERY:
56 OCDiscoveryPayloadDestroy((OCDiscoveryPayload*)payload);
58 case PAYLOAD_TYPE_PRESENCE:
59 OCPresencePayloadDestroy((OCPresencePayload*)payload);
61 case PAYLOAD_TYPE_SECURITY:
62 OCSecurityPayloadDestroy((OCSecurityPayload*)payload);
65 OIC_LOG_V(ERROR, TAG, "Unsupported payload type in destroy: %d", payload->type);
71 OCRepPayload* OCRepPayloadCreate()
73 OCRepPayload* payload = (OCRepPayload*)OICCalloc(1, sizeof(OCRepPayload));
80 payload->base.type = PAYLOAD_TYPE_REPRESENTATION;
85 void OCRepPayloadAppend(OCRepPayload* parent, OCRepPayload* child)
94 parent = parent->next;
101 static OCRepPayloadValue* OCRepPayloadFindValue(const OCRepPayload* payload, const char* name)
103 if (!payload || !name)
108 OCRepPayloadValue* val = payload->values;
111 if (0 == strcmp(val->name, name))
121 static void OCCopyPropertyValueArray(OCRepPayloadValue* dest, OCRepPayloadValue* source)
123 if (!dest || !source)
128 size_t dimTotal = calcDimTotal(source->arr.dimensions);
129 switch(source->arr.type)
132 dest->arr.iArray = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
133 VERIFY_PARAM_NON_NULL(TAG, dest->arr.iArray, "Failed allocating memory");
134 memcpy(dest->arr.iArray, source->arr.iArray, dimTotal * sizeof(int64_t));
136 case OCREP_PROP_DOUBLE:
137 dest->arr.dArray = (double*)OICMalloc(dimTotal * sizeof(double));
138 VERIFY_PARAM_NON_NULL(TAG, dest->arr.dArray, "Failed allocating memory");
139 memcpy(dest->arr.dArray, source->arr.dArray, dimTotal * sizeof(double));
141 case OCREP_PROP_BOOL:
142 dest->arr.bArray = (bool*)OICMalloc(dimTotal * sizeof(bool));
143 VERIFY_PARAM_NON_NULL(TAG, dest->arr.bArray, "Failed allocating memory");
144 memcpy(dest->arr.bArray, source->arr.bArray, dimTotal * sizeof(bool));
146 case OCREP_PROP_STRING:
147 dest->arr.strArray = (char**)OICMalloc(dimTotal * sizeof(char*));
148 VERIFY_PARAM_NON_NULL(TAG, dest->arr.strArray, "Failed allocating memory");
149 for(size_t i = 0; i < dimTotal; ++i)
151 dest->arr.strArray[i] = OICStrdup(source->arr.strArray[i]);
152 VERIFY_PARAM_NON_NULL(TAG, dest->arr.strArray[i], "Failed to duplicate string");
155 case OCREP_PROP_OBJECT:
156 dest->arr.objArray = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
157 VERIFY_PARAM_NON_NULL(TAG, dest->arr.objArray, "Failed allocating memory");
158 for(size_t i = 0; i < dimTotal; ++i)
160 dest->arr.objArray[i] = OCRepPayloadClone(source->arr.objArray[i]);
163 case OCREP_PROP_ARRAY:
164 dest->arr.objArray = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
165 VERIFY_PARAM_NON_NULL(TAG, dest->arr.objArray, "Failed allocating memory");
166 for(size_t i = 0; i < dimTotal; ++i)
168 dest->arr.objArray[i] = OCRepPayloadClone(source->arr.objArray[i]);
171 case OCREP_PROP_BYTE_STRING:
172 dest->arr.ocByteStrArray = (OCByteString*)OICMalloc(dimTotal * sizeof(OCByteString));
173 VERIFY_PARAM_NON_NULL(TAG, dest->arr.ocByteStrArray, "Failed allocating memory");
174 for (size_t i = 0; i < dimTotal; ++i)
176 OCByteStringCopy(&dest->arr.ocByteStrArray[i], &source->arr.ocByteStrArray[i]);
177 VERIFY_PARAM_NON_NULL(TAG, dest->arr.ocByteStrArray[i].bytes, "Failed allocating memory");
181 OIC_LOG(ERROR, TAG, "CopyPropertyValueArray invalid type");
188 static void OCCopyPropertyValue (OCRepPayloadValue *dest, OCRepPayloadValue *source)
190 if (!source || !dest)
197 case OCREP_PROP_STRING:
198 dest->str = OICStrdup(source->str);
200 case OCREP_PROP_BYTE_STRING:
201 dest->ocByteStr.bytes = (uint8_t*)OICMalloc(source->ocByteStr.len * sizeof(uint8_t));
202 VERIFY_PARAM_NON_NULL(TAG, dest->ocByteStr.bytes, "Failed allocating memory");
203 dest->ocByteStr.len = source->ocByteStr.len;
204 memcpy(dest->ocByteStr.bytes, source->ocByteStr.bytes, dest->ocByteStr.len);
206 case OCREP_PROP_OBJECT:
207 dest->obj = OCRepPayloadClone(source->obj);
209 case OCREP_PROP_ARRAY:
210 OCCopyPropertyValueArray(dest, source);
213 // Nothing to do for the trivially copyable types.
220 static void OCFreeRepPayloadValueContents(OCRepPayloadValue* val)
227 if (val->type == OCREP_PROP_STRING)
231 else if (val->type == OCREP_PROP_BYTE_STRING)
233 OICFree(val->ocByteStr.bytes);
235 else if (val->type == OCREP_PROP_OBJECT)
237 OCRepPayloadDestroy(val->obj);
239 else if (val->type == OCREP_PROP_ARRAY)
241 size_t dimTotal = calcDimTotal(val->arr.dimensions);
242 switch(val->arr.type)
245 case OCREP_PROP_DOUBLE:
246 case OCREP_PROP_BOOL:
247 // Since this is a union, iArray will
248 // point to all of the above
249 OICFree(val->arr.iArray);
251 case OCREP_PROP_STRING:
252 for(size_t i = 0; i < dimTotal; ++i)
254 OICFree(val->arr.strArray[i]);
256 OICFree(val->arr.strArray);
258 case OCREP_PROP_BYTE_STRING:
259 for (size_t i = 0; i < dimTotal; ++i)
261 if (val->arr.ocByteStrArray[i].bytes)
263 OICFree(val->arr.ocByteStrArray[i].bytes);
266 OICFree(val->arr.ocByteStrArray);
268 case OCREP_PROP_OBJECT: // This case is the temporary fix for string input
269 for(size_t i = 0; i< dimTotal; ++i)
271 OCRepPayloadDestroy(val->arr.objArray[i]);
273 OICFree(val->arr.objArray);
275 case OCREP_PROP_NULL:
276 case OCREP_PROP_ARRAY:
277 OIC_LOG_V(ERROR, TAG, "FreeRepPayloadValueContents: Illegal type\
278 inside an array: %d", val->arr.type);
284 static void OCFreeRepPayloadValue(OCRepPayloadValue* val)
292 OCFreeRepPayloadValueContents(val);
293 OCFreeRepPayloadValue(val->next);
296 static OCRepPayloadValue* OCRepPayloadValueClone (OCRepPayloadValue* source)
303 OCRepPayloadValue *sourceIter = source;
304 OCRepPayloadValue *destIter = (OCRepPayloadValue*) OICCalloc(1, sizeof(OCRepPayloadValue));
310 OCRepPayloadValue *headOfClone = destIter;
312 // Copy payload type and non pointer types in union.
313 *destIter = *sourceIter;
314 destIter->name = OICStrdup (sourceIter->name);
315 OCCopyPropertyValue (destIter, sourceIter);
317 sourceIter = sourceIter->next;
321 destIter->next = (OCRepPayloadValue*) OICCalloc(1, sizeof(OCRepPayloadValue));
324 OCFreeRepPayloadValue (headOfClone);
328 *(destIter->next) = *sourceIter;
329 destIter->next->name = OICStrdup (sourceIter->name);
330 OCCopyPropertyValue (destIter->next, sourceIter);
332 sourceIter = sourceIter->next;
333 destIter = destIter->next;
338 static OCRepPayloadValue* OCRepPayloadFindAndSetValue(OCRepPayload* payload, const char* name,
339 OCRepPayloadPropType type)
341 if (!payload || !name)
346 OCRepPayloadValue* val = payload->values;
349 payload->values = (OCRepPayloadValue*)OICCalloc(1, sizeof(OCRepPayloadValue));
350 if (!payload->values)
354 payload->values->name = OICStrdup(name);
355 if (!payload->values->name)
357 OICFree(payload->values);
358 payload->values = NULL;
361 payload->values->type =type;
362 return payload->values;
367 if (0 == strcmp(val->name, name))
369 OCFreeRepPayloadValueContents(val);
373 else if (val->next == NULL)
375 val->next = (OCRepPayloadValue*)OICCalloc(1, sizeof(OCRepPayloadValue));
380 val->next->name = OICStrdup(name);
381 if (!val->next->name)
387 val->next->type =type;
394 OIC_LOG(ERROR, TAG, "FindAndSetValue reached point after while loop, pointer corruption?");
398 bool OCRepPayloadAddResourceType(OCRepPayload* payload, const char* resourceType)
400 return OCRepPayloadAddResourceTypeAsOwner(payload, OICStrdup(resourceType));
403 bool OCRepPayloadAddResourceTypeAsOwner(OCRepPayload* payload, char* resourceType)
405 if (!payload || !resourceType)
412 OCStringLL* cur = payload->types;
417 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
424 cur->next->value = resourceType;
429 payload->types = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
434 payload->types->value = resourceType;
439 bool OCRepPayloadAddInterface(OCRepPayload* payload, const char* iface)
441 return OCRepPayloadAddInterfaceAsOwner(payload, OICStrdup(iface));
444 bool OCRepPayloadAddInterfaceAsOwner(OCRepPayload* payload, char* iface)
446 if (!payload || !iface)
451 if (payload->interfaces)
453 OCStringLL* cur = payload->interfaces;
458 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
464 cur->next->value = iface;
469 payload->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
470 if (!payload->interfaces)
474 payload->interfaces->value = iface;
479 bool OCRepPayloadSetUri(OCRepPayload* payload, const char* uri)
485 OICFree(payload->uri);
486 payload->uri = OICStrdup(uri);
487 return payload->uri != NULL;
490 bool OCRepPayloadIsNull(const OCRepPayload* payload, const char* name)
492 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
499 return val->type == OCREP_PROP_NULL;
502 static bool OCRepPayloadSetProp(OCRepPayload* payload, const char* name,
503 void* value, OCRepPayloadPropType type)
505 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, type);
513 val->i = *(int64_t*)value;
515 case OCREP_PROP_DOUBLE:
516 val->d = *(double*)value;
518 case OCREP_PROP_BOOL:
519 val->b = *(bool*)value;
521 case OCREP_PROP_OBJECT:
522 val->obj = (OCRepPayload*)value;
524 case OCREP_PROP_STRING:
525 val->str = (char*)value;
526 return val->str != NULL;
527 case OCREP_PROP_BYTE_STRING:
528 val->ocByteStr = *(OCByteString*)value;
529 return val->ocByteStr.bytes != NULL;
530 case OCREP_PROP_NULL:
532 case OCREP_PROP_ARRAY:
540 bool OCRepPayloadSetNull(OCRepPayload* payload, const char* name)
542 return OCRepPayloadSetProp(payload, name, NULL, OCREP_PROP_NULL);
545 bool OCRepPayloadSetPropInt(OCRepPayload* payload,
546 const char* name, int64_t value)
548 return OCRepPayloadSetProp(payload, name, &value, OCREP_PROP_INT);
551 bool OCRepPayloadGetPropInt(const OCRepPayload* payload, const char* name, int64_t* value)
553 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
555 if (!val || val->type != OCREP_PROP_INT)
564 bool OCRepPayloadSetPropDouble(OCRepPayload* payload,
565 const char* name, double value)
567 return OCRepPayloadSetProp(payload, name, &value, OCREP_PROP_DOUBLE);
570 bool OCRepPayloadGetPropDouble(const OCRepPayload* payload, const char* name, double* value)
572 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
576 if (val->type == OCREP_PROP_DOUBLE)
581 else if (val->type == OCREP_PROP_INT)
583 // Should be removed once IOT-1705 is fixed.
585 #pragma warning( suppress : 4244 )
597 bool OCRepPayloadSetPropString(OCRepPayload* payload, const char* name, const char* value)
599 char* temp = OICStrdup(value);
600 bool b = OCRepPayloadSetPropStringAsOwner(payload, name, temp);
609 bool OCRepPayloadSetPropStringAsOwner(OCRepPayload* payload, const char* name, char* value)
611 return OCRepPayloadSetProp(payload, name, value, OCREP_PROP_STRING);
614 bool OCRepPayloadGetPropString(const OCRepPayload* payload, const char* name, char** value)
616 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
618 if (!val || val->type != OCREP_PROP_STRING)
623 *value = OICStrdup(val->str);
624 return *value != NULL;
627 bool OCRepPayloadSetPropByteString(OCRepPayload* payload, const char* name, OCByteString value)
629 if (!value.bytes || !value.len)
634 OCByteString ocByteStr = {NULL, 0};
635 bool b = OCByteStringCopy(&ocByteStr, &value);
639 b = OCRepPayloadSetPropByteStringAsOwner(payload, name, &ocByteStr);
643 OICFree(ocByteStr.bytes);
648 bool OCRepPayloadSetPropByteStringAsOwner(OCRepPayload* payload, const char* name, OCByteString* value)
650 return OCRepPayloadSetProp(payload, name, value, OCREP_PROP_BYTE_STRING);
653 bool OCRepPayloadGetPropByteString(const OCRepPayload* payload, const char* name, OCByteString* value)
655 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
657 if (!val || val->type != OCREP_PROP_BYTE_STRING)
667 value->bytes = (uint8_t*)OICMalloc(val->ocByteStr.len * sizeof(uint8_t));
672 value->len = val->ocByteStr.len;
673 memcpy(value->bytes, val->ocByteStr.bytes, value->len);
678 bool OCRepPayloadSetPropBool(OCRepPayload* payload,
679 const char* name, bool value)
681 return OCRepPayloadSetProp(payload, name, &value, OCREP_PROP_BOOL);
684 bool OCRepPayloadGetPropBool(const OCRepPayload* payload, const char* name, bool* value)
686 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
688 if (!val || val->type != OCREP_PROP_BOOL)
698 static char *getStringFromEncodingType(OicEncodingType_t type)
703 case OIC_ENCODING_BASE64: str = OC_RSRVD_BASE64; break;
704 case OIC_ENCODING_DER: str = OC_RSRVD_DER; break;
705 case OIC_ENCODING_PEM: str = OC_RSRVD_PEM; break;
706 case OIC_ENCODING_RAW: str = OC_RSRVD_RAW; break;
707 default: str = OC_RSRVD_UNKNOWN; break;
710 snprintf(encoding, sizeof(encoding), "%s.%s.%s", OC_OIC_SEC, OC_RSRVD_ENCODING, str);
712 return OICStrdup(encoding);
715 bool OCRepPayloadSetPropPubDataTypeAsOwner(OCRepPayload *payload, const char *name,
716 const OicSecKey_t *value)
718 if (!payload || !name || !value)
723 bool binary_field = false;
724 if (OIC_ENCODING_RAW == value->encoding || OIC_ENCODING_DER == value->encoding)
729 OCRepPayload *heplerPayload = OCRepPayloadCreate();
735 char *encoding = getStringFromEncodingType(value->encoding);
736 if (!OCRepPayloadSetPropString(heplerPayload, OC_RSRVD_ENCODING, encoding))
738 OIC_LOG_V(ERROR, TAG, "Can't set %s", OC_RSRVD_ENCODING);
741 OCByteString val = {.bytes = value->data, .len = value->len};
744 if (!OCRepPayloadSetPropByteString(heplerPayload, OC_RSRVD_DATA, val))
746 OIC_LOG_V(ERROR, TAG, "Can't set %s", OC_RSRVD_DATA);
751 if (!OCRepPayloadSetPropString(heplerPayload, OC_RSRVD_DATA, (char *)val.bytes))
753 OIC_LOG_V(ERROR, TAG, "Can't set %s", OC_RSRVD_DATA);
757 if (!OCRepPayloadSetPropObject(payload, name, (const OCRepPayload *)heplerPayload))
759 OIC_LOG_V(ERROR, TAG, "Can't set %s", name);
762 OCRepPayloadDestroy(heplerPayload);
768 bool OCRepPayloadSetPropPubDataType(OCRepPayload *payload, const char *name,
769 const OicSecKey_t *value)
771 return OCRepPayloadSetPropPubDataTypeAsOwner(payload, name, value);
774 static OicEncodingType_t getEncodingTypeFromString(char *encoding)
776 OicEncodingType_t type = OIC_ENCODING_UNKNOW;
778 char *str = strrchr(encoding, '.');
781 OIC_LOG_V(ERROR, TAG, "Can't find . in %s", encoding);
784 str++; //go to encoding itself
786 if (0 == strcmp(str, OC_RSRVD_BASE64)) type = OIC_ENCODING_BASE64;
787 else if (0 == strcmp(str, OC_RSRVD_DER)) type = OIC_ENCODING_DER;
788 else if (0 == strcmp(str, OC_RSRVD_PEM)) type = OIC_ENCODING_PEM;
789 else if (0 == strcmp(str, OC_RSRVD_RAW)) type = OIC_ENCODING_RAW;
794 bool OCRepPayloadGetPropPubDataType(const OCRepPayload *payload, const char *name, OicSecKey_t *value)
796 OCRepPayload *heplerPayload = NULL;
797 char *encoding = NULL;
800 if (!payload || !name || !value)
805 if (!OCRepPayloadGetPropObject(payload, name, &heplerPayload))
807 OIC_LOG_V(ERROR, TAG, "Can't get object with name %s", name);
811 if (!OCRepPayloadGetPropString(heplerPayload, OC_RSRVD_ENCODING, &encoding))
813 OIC_LOG_V(ERROR, TAG, "Can't get %s", OC_RSRVD_ENCODING);
817 value->encoding = getEncodingTypeFromString(encoding);
821 if (!OCRepPayloadGetPropByteString(heplerPayload, OC_RSRVD_DATA, &val))
823 if (!OCRepPayloadGetPropString(heplerPayload, OC_RSRVD_DATA, (char **)&val.bytes))
825 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_DATA);
829 value->data = val.bytes;
830 value->len = strlen((const char*)val.bytes);
835 value->data = val.bytes;
836 value->len = val.len;
839 OCRepPayloadDestroy(heplerPayload);
844 bool OCRepPayloadSetPropObject(OCRepPayload* payload, const char* name, const OCRepPayload* value)
846 OCRepPayload* temp = OCRepPayloadClone(value);
847 bool b = OCRepPayloadSetPropObjectAsOwner(payload, name, temp);
851 OCRepPayloadDestroy(temp);
856 bool OCRepPayloadSetPropObjectAsOwner(OCRepPayload* payload, const char* name, OCRepPayload* value)
858 return OCRepPayloadSetProp(payload, name, value, OCREP_PROP_OBJECT);
861 bool OCRepPayloadGetPropObject(const OCRepPayload* payload, const char* name, OCRepPayload** value)
863 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
865 if (!val || val->type != OCREP_PROP_OBJECT)
870 *value = OCRepPayloadClone(val->obj);
871 return *value != NULL;
874 size_t calcDimTotal(const size_t dimensions[MAX_REP_ARRAY_DEPTH])
876 if (dimensions[0] == 0)
882 for(uint8_t i = 0; i < MAX_REP_ARRAY_DEPTH && dimensions[i] != 0; ++i)
884 total *= dimensions[i];
890 bool OCRepPayloadSetByteStringArrayAsOwner(OCRepPayload* payload, const char* name,
891 OCByteString* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
893 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
900 val->arr.type = OCREP_PROP_BYTE_STRING;
901 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
902 val->arr.ocByteStrArray = array;
907 bool OCRepPayloadSetByteStringArray(OCRepPayload* payload, const char* name,
908 const OCByteString* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
915 size_t dimTotal = calcDimTotal(dimensions);
921 OCByteString* newArray = (OCByteString*)OICCalloc(dimTotal, sizeof(OCByteString));
928 for (size_t i = 0; i < dimTotal; ++i)
930 newArray[i].bytes = (uint8_t*)OICMalloc(array[i].len * sizeof(uint8_t));
931 if (NULL == newArray[i].bytes)
933 for (size_t j = 0; j < i; ++j)
935 OICFree(newArray[j].bytes);
941 newArray[i].len = array[i].len;
942 memcpy(newArray[i].bytes, array[i].bytes, newArray[i].len);
945 bool b = OCRepPayloadSetByteStringArrayAsOwner(payload, name, newArray, dimensions);
948 for (size_t i = 0; i < dimTotal; ++i)
950 OICFree(newArray[i].bytes);
958 bool OCRepPayloadGetByteStringArray(const OCRepPayload* payload, const char* name,
959 OCByteString** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
961 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
963 if (!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_BYTE_STRING
964 || !val->arr.ocByteStrArray)
969 size_t dimTotal = calcDimTotal(val->arr.dimensions);
975 *array = (OCByteString*)OICCalloc(dimTotal, sizeof(OCByteString));
981 for (size_t i = 0; i < dimTotal; ++i)
983 OCByteString* tmp = &(*array)[i];
984 tmp->bytes = (uint8_t*)OICMalloc(val->arr.ocByteStrArray[i].len * sizeof(uint8_t));
985 if (NULL == tmp->bytes)
987 for (size_t j = 0; j < i; ++j)
989 OCByteString* temp = &(*array)[j];
990 OICFree(temp->bytes);
997 tmp->len = val->arr.ocByteStrArray[i].len;
998 memcpy(tmp->bytes, val->arr.ocByteStrArray[i].bytes, tmp->len);
1001 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1006 bool OCRepPayloadSetIntArrayAsOwner(OCRepPayload* payload, const char* name,
1007 int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1009 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
1016 val->arr.type = OCREP_PROP_INT;
1017 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1018 val->arr.iArray = array;
1023 bool OCRepPayloadSetIntArray(OCRepPayload* payload, const char* name,
1024 const int64_t* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1026 size_t dimTotal = calcDimTotal(dimensions);
1032 int64_t* newArray = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
1039 memcpy(newArray, array, dimTotal * sizeof(int64_t));
1042 bool b = OCRepPayloadSetIntArrayAsOwner(payload, name, newArray, dimensions);
1050 bool OCRepPayloadGetIntArray(const OCRepPayload* payload, const char* name,
1051 int64_t** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1053 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
1055 if (!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_INT
1056 || !val->arr.iArray)
1061 size_t dimTotal = calcDimTotal(val->arr.dimensions);
1066 *array = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
1072 memcpy(*array, val->arr.iArray, dimTotal * sizeof(int64_t));
1073 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1077 bool OCRepPayloadSetDoubleArrayAsOwner(OCRepPayload* payload, const char* name,
1078 double* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1080 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
1087 val->arr.type = OCREP_PROP_DOUBLE;
1088 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1089 val->arr.dArray = array;
1093 bool OCRepPayloadSetDoubleArray(OCRepPayload* payload, const char* name,
1094 const double* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1096 size_t dimTotal = calcDimTotal(dimensions);
1102 double* newArray = (double*)OICMalloc(dimTotal * sizeof(double));
1109 memcpy(newArray, array, dimTotal * sizeof(double));
1111 bool b = OCRepPayloadSetDoubleArrayAsOwner(payload, name, newArray, dimensions);
1119 bool OCRepPayloadGetDoubleArray(const OCRepPayload* payload, const char* name,
1120 double** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1122 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
1125 (val->type != OCREP_PROP_ARRAY) ||
1126 ((val->arr.type != OCREP_PROP_DOUBLE) &&
1127 (val->arr.type != OCREP_PROP_INT)) ||
1133 size_t dimTotal = calcDimTotal(val->arr.dimensions);
1138 *array = (double*)OICMalloc(dimTotal * sizeof(double));
1144 if (val->arr.type == OCREP_PROP_DOUBLE)
1146 memcpy(*array, val->arr.dArray, dimTotal * sizeof(double));
1150 /* need to convert from integer */
1152 for ( ; n < dimTotal; ++n)
1154 // Should be removed once IOT-1705 is fixed.
1156 #pragma warning( suppress : 4244 )
1157 (*array)[n] = val->arr.iArray[n];
1159 (*array)[n] = val->arr.iArray[n];
1163 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1167 bool OCRepPayloadSetStringArrayAsOwner(OCRepPayload* payload, const char* name,
1168 char** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1170 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
1177 val->arr.type = OCREP_PROP_STRING;
1178 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1179 val->arr.strArray = array;
1183 bool OCRepPayloadSetStringArray(OCRepPayload* payload, const char* name,
1184 const char** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1186 size_t dimTotal = calcDimTotal(dimensions);
1192 char** newArray = (char**)OICMalloc(dimTotal * sizeof(char*));
1199 for(size_t i = 0; i < dimTotal; ++i)
1201 newArray[i] = OICStrdup(array[i]);
1204 bool b = OCRepPayloadSetStringArrayAsOwner(payload, name, newArray, dimensions);
1208 for(size_t i = 0; i < dimTotal; ++i)
1210 OICFree(newArray[i]);
1217 bool OCRepPayloadGetStringArray(const OCRepPayload* payload, const char* name,
1218 char*** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1220 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
1222 if (!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_STRING
1223 || !val->arr.strArray)
1228 size_t dimTotal = calcDimTotal(val->arr.dimensions);
1233 *array = (char**)OICMalloc(dimTotal * sizeof(char*));
1239 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1241 for(size_t i = 0; i < dimTotal; ++i)
1243 (*array)[i] = OICStrdup(val->arr.strArray[i]);
1250 bool OCRepPayloadSetBoolArrayAsOwner(OCRepPayload* payload, const char* name,
1251 bool* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1254 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
1261 val->arr.type = OCREP_PROP_BOOL;
1262 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1263 val->arr.bArray = array;
1267 bool OCRepPayloadSetBoolArray(OCRepPayload* payload, const char* name,
1268 const bool* array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1270 size_t dimTotal = calcDimTotal(dimensions);
1276 bool* newArray = (bool*)OICMalloc(dimTotal * sizeof(bool));
1283 memcpy(newArray, array, dimTotal * sizeof(bool));
1286 bool b = OCRepPayloadSetBoolArrayAsOwner(payload, name, newArray, dimensions);
1294 bool OCRepPayloadGetBoolArray(const OCRepPayload* payload, const char* name,
1295 bool** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1297 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
1299 if (!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_BOOL
1300 || !val->arr.bArray)
1305 size_t dimTotal = calcDimTotal(val->arr.dimensions);
1310 *array = (bool*)OICMalloc(dimTotal * sizeof(bool));
1316 memcpy(*array, val->arr.bArray, dimTotal * sizeof(bool));
1317 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1321 bool OCRepPayloadSetPropObjectArrayAsOwner(OCRepPayload* payload, const char* name,
1322 OCRepPayload** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1324 OCRepPayloadValue* val = OCRepPayloadFindAndSetValue(payload, name, OCREP_PROP_ARRAY);
1331 val->arr.type = OCREP_PROP_OBJECT;
1332 memcpy(val->arr.dimensions, dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1333 val->arr.objArray = array;
1338 bool OCRepPayloadSetPropObjectArray(OCRepPayload* payload, const char* name,
1339 const OCRepPayload** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1341 size_t dimTotal = calcDimTotal(dimensions);
1347 OCRepPayload** newArray = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
1354 for(size_t i = 0; i < dimTotal; ++i)
1356 newArray[i] = OCRepPayloadClone(array[i]);
1359 bool b = OCRepPayloadSetPropObjectArrayAsOwner(payload, name, newArray, dimensions);
1363 for(size_t i = 0; i < dimTotal; ++i)
1365 OCRepPayloadDestroy(newArray[i]);
1372 bool OCRepPayloadGetPropObjectArray(const OCRepPayload* payload, const char* name,
1373 OCRepPayload*** array, size_t dimensions[MAX_REP_ARRAY_DEPTH])
1375 OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
1377 if (!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_OBJECT
1378 || !val->arr.objArray)
1383 size_t dimTotal = calcDimTotal(val->arr.dimensions);
1388 *array = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
1394 memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
1396 for(size_t i = 0; i < dimTotal; ++i)
1398 (*array)[i] = OCRepPayloadClone(val->arr.objArray[i]);
1404 void OCFreeOCStringLL(OCStringLL* ll)
1411 OCFreeOCStringLL(ll->next);
1416 OCStringLL* CloneOCStringLL (OCStringLL* ll)
1423 OCStringLL *sourceIter = ll;
1425 OCStringLL *destIter = (OCStringLL*)OICCalloc (1, sizeof (OCStringLL));
1430 destIter->value = OICStrdup (sourceIter->value);
1432 OCStringLL *headOfClone = destIter;
1434 sourceIter = sourceIter->next;
1438 destIter->next = (OCStringLL*)OICCalloc (1, sizeof (OCStringLL));
1439 if (!destIter->next)
1441 OCFreeOCStringLL (headOfClone);
1444 destIter->next->value = OICStrdup (sourceIter->value);
1446 destIter = destIter->next;
1447 sourceIter = sourceIter->next;
1452 OCStringLL* OCCreateOCStringLL(const char* text)
1457 char *backup = NULL;
1458 OCStringLL* result = NULL;
1459 OCStringLL* iter = NULL;
1460 OCStringLL* prev = NULL;
1461 static const char delim[] = { CSV_SEPARATOR, '\0' };
1463 VERIFY_PARAM_NON_NULL(TAG, text, "Invalid parameter");
1464 backup = OICStrdup(text);
1465 VERIFY_PARAM_NON_NULL(TAG, backup, "Failed allocating memory");
1467 for (head = backup; ; head = NULL)
1469 token = (char *) strtok_r(head, delim, &tail);
1474 iter = (OCStringLL *)OICCalloc(1,sizeof(OCStringLL));
1475 VERIFY_PARAM_NON_NULL(TAG, iter, "Failed allocating memory");
1484 iter->value = OICStrdup(token);
1485 VERIFY_PARAM_NON_NULL(TAG, iter->value, "Failed allocating memory");
1494 OCFreeOCStringLL(result);
1498 char* OCCreateString(const OCStringLL* ll)
1511 for (const OCStringLL *it = ll; it; it = it->next)
1513 len += strlen(it->value) + 1;
1515 len--; // remove trailing separator (just added above)
1516 str = (char*) OICMalloc(len + 1);
1523 const OCStringLL *it = ll;
1526 sublen = strlen(it->value);
1527 count = snprintf(pos, len + 1, "%s", it->value);
1528 if ((size_t)count < sublen)
1539 *pos = CSV_SEPARATOR;
1548 bool OCByteStringCopy(OCByteString* dest, const OCByteString* source)
1550 VERIFY_PARAM_NON_NULL(TAG, source, "Bad input");
1554 dest = (OCByteString *)OICMalloc(sizeof(OCByteString));
1555 VERIFY_PARAM_NON_NULL(TAG, dest, "Failed allocating memory");
1559 OICFree(dest->bytes);
1561 dest->bytes = (uint8_t*)OICMalloc(source->len * sizeof(uint8_t));
1562 VERIFY_PARAM_NON_NULL(TAG, dest->bytes, "Failed allocating memory");
1563 memcpy(dest->bytes, source->bytes, source->len * sizeof(uint8_t));
1564 dest->len = source->len;
1571 OICFree(dest->bytes);
1578 OCRepPayload* OCRepPayloadClone (const OCRepPayload* payload)
1585 OCRepPayload *clone = OCRepPayloadCreate();
1592 clone->uri = OICStrdup (payload->uri);
1593 clone->types = CloneOCStringLL (payload->types);
1594 clone->interfaces = CloneOCStringLL (payload->interfaces);
1595 clone->values = OCRepPayloadValueClone (payload->values);
1600 OCRepPayload* OCRepPayloadBatchClone(const OCRepPayload* repPayload)
1602 OCRepPayload *newPayload = OCRepPayloadCreate();
1608 newPayload->uri = OICStrdup(repPayload->uri);
1609 OCRepPayload *clone = OCRepPayloadCreate();
1612 OCPayloadDestroy((OCPayload *)newPayload);
1616 clone->types = CloneOCStringLL(repPayload->types);
1617 clone->interfaces = CloneOCStringLL(repPayload->interfaces);
1618 clone->values = OCRepPayloadValueClone(repPayload->values);
1619 OCRepPayloadSetPropObjectAsOwner(newPayload, OC_RSRVD_REPRESENTATION, clone);
1624 void OCRepPayloadDestroy(OCRepPayload* payload)
1631 OICFree(payload->uri);
1632 OCFreeOCStringLL(payload->types);
1633 OCFreeOCStringLL(payload->interfaces);
1634 OCFreeRepPayloadValue(payload->values);
1635 OCRepPayloadDestroy(payload->next);
1639 OCDiscoveryPayload* OCDiscoveryPayloadCreate()
1641 OCDiscoveryPayload* payload = (OCDiscoveryPayload*)OICCalloc(1, sizeof(OCDiscoveryPayload));
1648 payload->base.type = PAYLOAD_TYPE_DISCOVERY;
1653 OCSecurityPayload* OCSecurityPayloadCreate(const uint8_t* securityData, size_t size)
1655 OCSecurityPayload* payload = (OCSecurityPayload*)OICCalloc(1, sizeof(OCSecurityPayload));
1662 payload->base.type = PAYLOAD_TYPE_SECURITY;
1663 payload->securityData = (uint8_t *)OICCalloc(1, size);
1664 if (!payload->securityData)
1669 memcpy(payload->securityData, (uint8_t *)securityData, size);
1670 payload->payloadSize = size;
1675 void OCSecurityPayloadDestroy(OCSecurityPayload* payload)
1682 OICClearMemory(payload->securityData, payload->payloadSize);
1683 OICFree(payload->securityData);
1687 size_t OCDiscoveryPayloadGetResourceCount(OCDiscoveryPayload* payload)
1690 OCResourcePayload* p = payload->resources;
1699 OCResourcePayload* OCDiscoveryPayloadGetResource(OCDiscoveryPayload* payload, size_t index)
1702 OCResourcePayload* p = payload->resources;
1715 size_t OCEndpointPayloadGetEndpointCount(OCEndpointPayload* payload)
1718 OCEndpointPayload* ep = payload;
1727 OCEndpointPayload* OCEndpointPayloadGetEndpoint(OCEndpointPayload* payload, size_t index)
1730 OCEndpointPayload* ep = payload;
1743 void OCResourcePayloadAddNewEndpoint(OCResourcePayload* payload, OCEndpointPayload* endpoint)
1752 payload->eps = endpoint;
1756 OCEndpointPayload* ep = payload->eps;
1761 ep->next = endpoint;
1765 static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t securePort,
1766 CAEndpoint_t *networkInfo, size_t infoSize,
1767 const OCDevAddr *devAddr
1774 OCResourcePayload* pl = (OCResourcePayload*)OICCalloc(1, sizeof(OCResourcePayload));
1780 OCEndpointPayload *selfEp = NULL;
1781 if (networkInfo && infoSize && devAddr)
1783 OCEndpointPayload *lastNode = pl->eps;
1784 if ((OC_ADAPTER_IP | OC_ADAPTER_TCP) & (devAddr->adapter))
1786 for (size_t i = 0; i < infoSize; i++)
1788 CAEndpoint_t *info = networkInfo + i;
1790 if (((CA_ADAPTER_IP | CA_ADAPTER_TCP) & info->adapter &&
1791 info->ifindex == devAddr->ifindex) ||
1792 info->adapter == CA_ADAPTER_RFCOMM_BTEDR)
1794 OCTpsSchemeFlags matchedTps = OC_NO_TPS;
1795 if (OC_STACK_OK != OCGetMatchedTpsFlags(info->adapter,
1802 if ((res->endpointType) & matchedTps)
1805 OCEndpointPayload* tmpNode = (OCEndpointPayload*)
1806 OICCalloc(1, sizeof(OCEndpointPayload));
1812 OCStackResult ret = OCConvertTpsToString(matchedTps, &(tmpNode->tps));
1813 if (ret != OC_STACK_OK)
1815 OCDiscoveryEndpointDestroy(tmpNode);
1816 OCDiscoveryResourceDestroy(pl);
1820 tmpNode->addr = (char*)OICCalloc(MAX_ADDR_STR_SIZE, sizeof(char));
1823 OCDiscoveryEndpointDestroy(tmpNode);
1824 OCDiscoveryResourceDestroy(pl);
1828 memcpy(tmpNode->addr, info->addr, sizeof(info->addr));
1829 tmpNode->family = (OCTransportFlags)(info->flags);
1830 tmpNode->port = info->port;
1832 tmpNode->next = NULL;
1834 // remember endpoint that matches devAddr for use in anchor.
1835 OCTransportFlags infoFlagsSecureFams = (OCTransportFlags)
1836 (info->flags & MASK_SECURE_FAMS);
1837 if ((infoFlagsSecureFams & devAddr->flags) == infoFlagsSecureFams)
1850 lastNode->next = tmpNode;
1859 pl->uri = OICStrdup(res->uri);
1862 OCDiscoveryResourceDestroy(pl);
1866 // relation is always the default unless the resource is the well known URI
1867 if (0 == strcmp(res->uri, OC_RSRVD_WELL_KNOWN_URI))
1869 pl->rel = OICStrdup("self");
1872 OCDiscoveryResourceDestroy(pl);
1878 char *anchor = OCCreateEndpointString(selfEp);
1881 pl->anchor = anchor;
1885 OIC_LOG(ERROR, TAG, "Can't determine anchor");
1889 OCResourceType* typePtr = res->rsrcType;
1891 if (typePtr != NULL)
1893 pl->types = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1896 OCDiscoveryResourceDestroy(pl);
1899 pl->types->value = OICStrdup(typePtr->resourcetypename);
1900 if (!pl->types->value)
1902 OCDiscoveryResourceDestroy(pl);
1906 OCStringLL* cur = pl->types;
1907 typePtr = typePtr->next;
1910 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1913 OCDiscoveryResourceDestroy(pl);
1916 cur->next->value = OICStrdup(typePtr->resourcetypename);
1917 if (!cur->next->value)
1919 OCDiscoveryResourceDestroy(pl);
1923 typePtr = typePtr->next;
1928 OCResourceInterface* ifPtr = res->rsrcInterface;
1931 pl->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1932 if (!pl->interfaces)
1934 OCDiscoveryResourceDestroy(pl);
1937 pl->interfaces->value = OICStrdup(ifPtr->name);
1938 if (!pl->interfaces->value)
1940 OCDiscoveryResourceDestroy(pl);
1944 OCStringLL* cur = pl->interfaces;
1945 ifPtr = ifPtr->next;
1948 cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
1951 OCDiscoveryResourceDestroy(pl);
1954 cur->next->value = OICStrdup(ifPtr->name);
1955 if (!cur->next->value)
1957 OCDiscoveryResourceDestroy(pl);
1961 ifPtr = ifPtr->next;
1965 pl->bitmap = res->resourceProperties & (OC_OBSERVABLE | OC_DISCOVERABLE
1970 pl->secure = (res->resourceProperties & OC_SECURE) != 0;
1971 pl->port = securePort;
1973 pl->tcpPort = tcpPort;
1980 void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
1981 uint16_t securePort)
1983 OCDiscoveryPayloadAddNewResource(payload, OCCopyResource(res, securePort, NULL, 0, NULL));
1986 void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource* res,
1987 uint16_t securePort, uint16_t tcpPort)
1989 OCDiscoveryPayloadAddNewResource(payload, OCCopyResource(res, securePort, NULL, 0, NULL,
1995 void OCDiscoveryPayloadAddResourceWithEps(OCDiscoveryPayload* payload, const OCResource* res,
1996 uint16_t securePort, void *networkInfo, size_t infoSize,
1997 const OCDevAddr *devAddr)
1999 OCDiscoveryPayloadAddNewResource(payload,
2000 OCCopyResource(res, securePort, (CAEndpoint_t *)networkInfo,
2001 infoSize, devAddr));
2004 void OCDiscoveryPayloadAddResourceWithEps(OCDiscoveryPayload* payload, const OCResource* res,
2005 uint16_t securePort, void *networkInfo, size_t infoSize,
2006 const OCDevAddr *devAddr, uint16_t tcpPort)
2008 OCDiscoveryPayloadAddNewResource(payload,
2009 OCCopyResource(res, securePort, (CAEndpoint_t *)networkInfo,
2010 infoSize, devAddr, tcpPort));
2014 bool OCResourcePayloadAddStringLL(OCStringLL **stringLL, const char *value)
2017 VERIFY_PARAM_NON_NULL(TAG, value, "Invalid Parameters");
2018 dup = OICStrdup(value);
2019 VERIFY_PARAM_NON_NULL(TAG, dup, "Failed copying string");
2023 *stringLL = (OCStringLL *)OICCalloc(1, sizeof(OCStringLL));
2024 VERIFY_PARAM_NON_NULL(TAG, *stringLL, "Failed allocating memory");
2025 (*stringLL)->value = dup;
2030 OCStringLL *temp = *stringLL;
2035 temp->next = (OCStringLL *)OICCalloc(1, sizeof(OCStringLL));
2036 VERIFY_PARAM_NON_NULL(TAG, temp->next, "Failed allocating memory");
2037 temp->next->value = dup;
2045 void OCDiscoveryPayloadAddNewResource(OCDiscoveryPayload* payload, OCResourcePayload* res)
2052 if (!payload->resources)
2054 payload->resources = res;
2058 OCResourcePayload* p = payload->resources;
2067 void OCDiscoveryEndpointDestroy(OCEndpointPayload* payload)
2074 OICFree(payload->tps);
2075 OICFree(payload->addr);
2076 OCDiscoveryEndpointDestroy(payload->next);
2080 void OCDiscoveryResourceDestroy(OCResourcePayload* payload)
2087 OICFree(payload->uri);
2088 OICFree(payload->rel);
2089 OICFree(payload->anchor);
2090 OCFreeOCStringLL(payload->types);
2091 OCFreeOCStringLL(payload->interfaces);
2092 OCDiscoveryEndpointDestroy(payload->eps);
2093 OCDiscoveryResourceDestroy(payload->next);
2097 void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload)
2103 OICFree(payload->sid);
2104 OCFreeOCStringLL(payload->type);
2105 OICFree(payload->name);
2106 OCFreeOCStringLL(payload->iface);
2107 OCDiscoveryResourceDestroy(payload->resources);
2108 OCDiscoveryPayloadDestroy(payload->next);
2112 OCPresencePayload* OCPresencePayloadCreate(uint32_t seqNum, uint32_t maxAge,
2113 OCPresenceTrigger trigger, const char* resourceType)
2115 OCPresencePayload* payload = (OCPresencePayload*)OICCalloc(1, sizeof(OCPresencePayload));
2121 payload->base.type = PAYLOAD_TYPE_PRESENCE;
2122 payload->sequenceNumber = seqNum;
2123 payload->maxAge = maxAge;
2124 payload->trigger = trigger;
2125 payload->resourceType = OICStrdup(resourceType);
2129 void OCPresencePayloadDestroy(OCPresencePayload* payload)
2135 OICFree(payload->resourceType);